1. ggplot中的scale_*_*()函数
借助代码:
help(package = "ggplot2")
获取ggolot2中的所有函数名称,检索到scale_*_*,可以看到有近百个函数,总结下来,可以分为几个大类,分别是:
- scale_alpha_*() 【设置透明度】
- scale_color_*() 或 scale_colour_*() 【设置边框/散点颜色】
- scale_fill_*() 【设置填充颜色和图例相关内容】
- scale_linetype_*() 【设置线条样式】
- scale_shape_*() 【设置散点样式】
- scale_size_*() 【设置散点/文本大小】
- scale_radius_*() 【设置散点半径大小】
- scale_x_*() 【设置横坐标相关参数】
- scale_y_*() 【设置纵坐标相关参数】
其中,alpha, size, radius语法较为相似,linetype, shape较为相似,color, fill较为相似,x, y较为相似,因此主要分为以下四个部分学习
1. alpha, size, radius,
2. linetype, shape
3. color, fill
4. scale_x_*() 和 scale_y_*()
5. scale_*_manual()
介绍性质,参考网址 https://zhuanlan.zhihu.com/p/102520133
2.颜色标尺设置
2.1 连续型颜色标尺
当前版本的ggplot2提供了13个填充色设置的标尺函数(线条颜色也一样):
> ls("package:ggplot2", pattern = "^scale_fill.+")
[1] "scale_fill_brewer" "scale_fill_continuous" "scale_fill_date"
[4] "scale_fill_datetime" "scale_fill_discrete" "scale_fill_distiller"
[7] "scale_fill_gradient" "scale_fill_gradient2" "scale_fill_gradientn"
[10] "scale_fill_grey" "scale_fill_hue" "scale_fill_identity"
[13] "scale_fill_manual"
先看看“continuous”的用法。对于数据为非因子型的填充色映射,ggplot2自动使用“continuous”类型颜色标尺表示连续颜色空间。如果要修改默认颜色就要使用scale_fill_continuous函数进行修改,这个函数最有用的参数是low和high,分别表示低端和高端数据的颜色,中间颜色根据颜色空间space自动计算:
theme_set(theme_bw())
df <- expand.grid(1:30, 1:30)
colnames(df) <- c("x", "y")
df$z <- rnorm(900)
p <- ggplot(data = df, aes(x = x, y = y, fill = z))
p + geom_raster()
p + geom_raster() + scale_fill_continuous(low = "darkgreen", high = "orangered", space = "rgb")
颜色可以使用预设颜色名称,也可以使用十六进制表示。颜色空间可以是rgb或Lab,两者差别还比较大(rgb已经弃用):
p + geom_raster() + scale_fill_continuous(low = "#000099", high = "#FF0000", space = "rgb")
p + geom_raster() + scale_fill_continuous(low = "#000099", high = "#FF0000", space = "Lab")
连续填充色设置函数还有scale_fill_gradient,scale_fill_gradient2和 scale_fill_gradientn,其中scale_fill_gradient的用法和作用和scale_fill_continuous完全相同(其实ggplot2早期版本连续颜色标尺默认使用scale_fill_gradient,没有scale_fill_continuous函数;后者可能是H.W头脑清楚以后加进去的,相当于前者的别名)。scale_fill_gradient2增加了中间点和中间颜色的设置,效果相当不错:
p + geom_raster() + scale_fill_gradient2(low = "darkgreen", high = "red", mid = "yellow")
p + geom_raster() + scale_fill_gradient2(low = "darkgreen", high = "red", mid = "yellow", midpoint = 1)
而scale_fill_gradientn可以使用colours参数设置多个中间颜色,配合其它颜色参数函数使用也很不错:
p + geom_raster() + scale_fill_gradientn(colours = c("blue", "green", "yellow", "red"))
p + geom_raster() + scale_fill_gradientn(colours = terrain.colors(100))
注意参数名称为colours,不是colors,米国人民可能不习惯,不过问题不大。
2.2 离散(间断)型颜色标尺
如果数据是因子型的颜色映射,颜色标尺则是离散型的,修改标尺需要使用相应的离散型颜色标尺如scale_color_discrete或scale_color_hue。这两个函数只是别名函数,早期版本只有scale_color_hue。它们通过设置色调范围(h)、饱和度(c)和亮 度(l)获取颜色,不太容易掌握:
set.seed(100)
dt <- diamonds[sample(nrow(diamonds), 500), ]
p <- ggplot(data = dt, aes(x = carat, y = price, color = cut))
p + geom_point() + scale_color_discrete()
p + geom_point() + scale_color_discrete(h = c(150, 350), c = 100, l = 60)
注意:因为映射是color,所以标尺设置也得相应用scale_color而不是scale_fill。
scale_color_discrete或scale_color_hue设置颜色不是很直观,如果想要啥来啥,那就用manual类型函数:
p + geom_point() + scale_color_manual(values = c("blue", "cyan", "yellow", "orange", "red"))
p + geom_point() + scale_color_manual(values = rainbow(5))
grey灰度标尺函数是设置离散型颜色的另外一类函数,用法很简单。
p + geom_point() + scale_color_grey(start = 0, end = 0.8)
brewer类型函数则可以直接使用RColorBrewer包预定义的一些调色板,那些调色板最多能设置8-11种颜色不等,如果超过最大颜色数就不合适了。
x <- sample(LETTERS, 13)
y <- 1:13 qplot(x = x, y = y, fill = x, geom = "bar") + scale_fill_brewer(palette = "YlOrRd")
x <- x[1:8] y = y[1:8] qplot(x = x, y = y, fill = x, geom = "bar") + scale_fill_brewer(palette = "YlOrRd")
Palettes 在包 RColorBrewer 中 - 运行 display.brewer.all() 可以看到所有的选择:
有 3 类调色板(palettes)- sequential,diverging,和 qualitative - 每一类调色板包含 8 到 12 种颜色(可以利用 brewer.pal.info 或者 ?RColorBrewer 看到更多的细节)。
好奇的读者可能注意到如果柱状图包含 13 或者更多的柱子,我们可能会有下面的图中的麻烦:
ggplot(mtcars) +
geom_bar(aes(factor(hp), fill=factor(hp))) +
scale_fill_brewer(palette="Set2")
与其去记那些调色板名称,还不如用manual可以设置自己需要的颜色(可参考本博客的文章《R语言进阶之一:颜色设置》)。
查看scale_fill_gradientn等函数的说明发现很多用于连续颜色设置的函数都有palette参数选项,似乎连续型和离散型颜色在函数上没有严格区别,但实际使用时会出错,或许这些功能只是H.W做的TODO list。
2.3.Viridis color palettes
viridis提供了五种色带:
- viridis:option D,为默认色带,翠绿色;
- magma:option A,岩溶色;
- inferno:option B,火焰色;
- plasma: option C,血色;
- cividis: option E;
library(ggplot2)
# Gradient color
ggplot(iris, aes(Sepal.Length, Sepal.Width))+
geom_point(aes(color = Sepal.Length)) +
scale_color_viridis(option = "D")+
theme_minimal() +
theme(legend.position = "bottom")
# Discrete color. use the argument discrete = TRUE
ggplot(iris, aes(Sepal.Length, Sepal.Width))+
geom_point(aes(color = Species)) +
geom_smooth(aes(color = Species, fill = Species), method = "lm") +
scale_color_viridis(discrete = TRUE, option = "D")+
scale_fill_viridis(discrete = TRUE) +
theme_minimal() +
theme(legend.position = "bottom")
参考:
1. https://openbiox.github.io/Cookbook-for-R-Chinese/ggplot2.html Cookbook for R 中文版
2. https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/ggplotvis.html ggplot的各种图形 (更详细推荐)