映射颜色的方法很多,对于连续型值有三种基于渐变的方法,对于离散型值有两种方法。
hcl色彩空间由三部分构成,分别是色相(hue)、彩度(chroma)、明度(luminance)。
所以绘图标准当中,最好避免使用红——绿比对,并且要使用可以模拟色盲情形的系统来检查你的图形。Visicheck就是一种在线解决方案。另外一种选择是使用dichromat包。
根据颜色梯度中的色彩数量划分,共有三类连续型颜色梯度(即渐变色):
例子:
> library(ggplot2)
> f2d <- with(faithful, MASS::kde2d(eruptions, waiting, h=c(1, 10), n = 50))
> df <- with(f2d, cbind(expand.grid(x,y), as.vector(z)))
> names(df) <- c("eruptions", "waiting", "density")
> erupt <- ggplot(df, aes(waiting, eruptions, fill=density)) + geom_tile() + scale_x_continuous(expand=c(0, 0)) + scale_y_continuous(expand=c(0, 0))
#expand作用是颜色图形铺满整个屏幕
> erupt + scale_fill_gradient(limits=c(0, 0.04))
#双色梯度从0到0.04进行颜色梯度的渐变
默认的颜色梯度:
> erupt + scale_fill_gradient(limits=c(0, 0.04), low="white", high="black")
#双色梯度,从0到0.04进行颜色梯度的渐变,但这里low为白色,high为黑色,所以颜色是从数据密度低低的白色渐变到数据密度高的黑色。
黑白二色梯度:
> erupt + scale_fill_gradient2(limits=c(-0.04, 0.04), midpoint = mean(df$density))
#这里是选用了数据当中的数值,并且利用midpoint参数设定为任意值,并将颜色区间设定为两个颜色区间,由偏向于-0.04这个值的铁红色的区间,渐变到0.04这个值的蓝色区间,中间0,表示为近白色。
erupt <- ggplot(df, aes(waiting, eruptions, fill=density)) + geom_tile() + scale_x_continuous(expand=c(0, 0)) + scale_y_continuous(expand=c(0, 0))
绘图选用是数据集是df,颜色填充所用的是fill=density的值,所以
erupt + scale_fill_gradient2(limits=c(-0.04, 0.04), midpoint = mean(df$density))
> mean(df$density)
[1] 0.004900266
实际上limits表示最高值颜色的彩度和最低值颜色的彩度。midpoint表示以哪个数值设定为白色,如果midpoint=0则以0值表示为白色,所有大于0值都会添加不同深度的蓝色,所有小于0值都会添加不同深度的铁红色,midpoint=0.04则以0.04表示为白色,那么图形中所有小于0.04的值都会设定不同深度的铁红色。
密度均值3点梯度:
要创建自定义的颜色梯度,使用scale_colour_gradientn()。在颜色能够代表数据的特征时很有用(例如,某个黑体的颜色或标准的地形色),或者也可以直接使用另外一些包生成调色板。
例如:vcd包生成的调色板。
> install.packages('vcd')
> library(vcd)
> f2d <- with(faithful, MASS::kde2d(eruptions, waiting, h=c(1, 10), n = 50))
> df <- with(f2d, cbind(expand.grid(x,y), as.vector(z)))
> names(df) <- c("eruptions", "waiting", "density")
> erupt <- ggplot(df, aes(waiting, eruptions, fill=density)) + geom_tile() + scale_x_continuous(expand=c(0, 0)) + scale_y_continuous(expand=c(0, 0))
> fill_gradn <- function(pal) {scale_fill_gradientn(colours=pal(7), limits=c(0, 0.04))}
#pal(7)表示选取指定颜色当中的7种颜色
> erupt + fill_gradn(rainbow)
#这里利用fill_gradn函数,选取rainbow当中的7种颜色,将这7种颜色作为渐变色
离散型数据有两种颜色标度。一种可以自动选择颜色,另一种可以轻松地从手工甄选地颜色集种选择颜色。
默认的配色方案,即scale_colour_hue(),可通过沿着hcl色轮选取均匀分布的色相来生成颜色。这种方案对多至约8种颜色时都能够有较好的效果,但对于更多的颜色。要区分开不同但颜色就变得比较困难。默认配色的另外一个缺点是,由于所有颜色都拥有相同的明度和彩度,所以当我们进行黑白打印时,它们就会成为几近相同的灰影。
除了这种基于计算的方案以外,另一种可选的方案是使用ColorBrewer配色,http://colorbrewer.org。可良好的应用于手工甄选颜色,这些颜色在展示较大面积是表现更佳。我们最感兴趣的是调色板,对于类别数据中的点而言是“Set1”和“Dark2”,对面积而言则是“Set2”、“Pastel1”、“Pastel2”和“Accent”。使用RColorBrewer::display.brewer.all可列出所有的调色版。例如:
> point <- qplot(brainwt, bodywt, data=msleep, log="xy", colour=vore)
> area <- qplot(log10(brainwt), data=msleep, fill=vore, binwidth=1)
> point + scale_colour_brewer(palette="Set1")
#A图
> point + scale_colour_brewer(palette="Dark2")
#B图
> area + scale_colour_brewer(palette="Set2")
#C图
> area + scale_colour_brewer(palette="Pastel1")
#D图
> area + scale_colour_brewer(palette="Pastel2")
#E图
> area + scale_colour_brewer(palette="Accent")
#F图
如果要用自制的离散型颜色标度,可使用下文所述的scale_colour_manual()。