本期内容
- 示例数据简介
- ggplot2详细用法介绍
示例数据介绍
本次我们使用著名的鸢尾花数据集(iris,R自带数据集,直接调用即可)来进行演示,此数据集包括3个品种的鸢尾花,每种50个样本。前4列分别为萼片的长、宽以及花瓣的长、宽,第5列为对应的品种名称。
数据概况如下:
用法详细介绍
怎么调用?
先绘制一张简单的图
library(ggplot2)
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()
如上我们可以看到,只需要简单一行代码即可轻松得到一幅散点图,我们来拆解一下这行代码
ggplot() 初始化ggplot对象,我们在这里指定读入数据集iris (data = iris),那么之后叠加的图层如果不是特别声明的话,使用的都是该数据集
aes() 指定美学映射,比如这个例子中就是指定X和Y轴分别用哪列变量(x = Sepal.Length, y = Sepal.Width),此例中美学映射在ggplot()中初始化,之后的图层如果不是特别指定的话,美学映射都不变
-
geom_point() 指定几何对象,也就是你想要绘制什么图,这里为散点图
除了散点图ggplot2可指定的几何对象还有很多,常用的还有:
- geom_line() 折线图
- geom_bar() 柱状图
- geom_boxplot() 箱线图
- geom_violin() 小提琴图
- geom_area() 面积图
- geom_density() 密度图
- geom_tile() 块状图
通俗的讲就是,你可以在ggplot()里预设好数据集,美学映射,之后添加的各个图层可以不用再重复声明(可以想象成默认设置):
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
p
如上,数据及映射已设置好,接下来只需要在此基础上叠加几何对象就行,添加散点图:
p + geom_point()
添加折线图:
p + geom_line()
也可以单独在每个图层进行设置(可以想象成个性化设置),如下,直接在散点图的图层里声明数据集及坐标轴映射:
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
或者,通用声明数据集,在散点图里单独声明坐标轴映射:
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width))
出来的结果都等同于第一幅图的结果:
那么再叠加一层折线图呢?我们用以上三种方式分别进行测试:
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point() +
geom_line()
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
geom_line()
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width)) +
geom_line()
分别得到以下结果:
第一种,正确出图(ggplot()里提前声明数据集及坐标轴,那么之后的图层都直接按照此映射):
第二种,折线图未显示(因为没有提前进行任何声明,只在散点图层里进行了独立声明,折线图层找不到数据集及坐标轴映射,直接不显示):
而第三种方式报错(因为只提前声明了数据集,在折线图层里找不到坐标轴映射,有数据却没有映射直接报错):
对于第二种和第三种问题,直接改成以下方式,即可成功出图:
第二种:
ggplot() + geom_point(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_line(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
第三种:
ggplot(data = iris) + geom_point(aes(x = Sepal.Length, y = Sepal.Width)) + geom_line(aes(x = Sepal.Length, y = Sepal.Width))
所以,如果之后有多个图层都是用到相同的映射,直接按第一种方式即可,简单明了。
如何调整?
以上基本图形出来了,想必你应该也对如何映射有了一定的了解。接下来想要添加一下颜色,调整一下点的大小、形状这些该怎么写呢?如下:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width))
p + geom_point(color = "#8283a7", size = 6, shape = 18)
可以看到所有的点都修改为了统一的颜色、大小、形状,那如果想设置不同的值呢?总共150个点,现在我们来自定义这些点的颜色和大小:
mycolor <- rep(c("#167c80", "#f0cf61", "#371722"), each = 50) # 三个颜色每个重复50次,共150个颜色
mysize <- rep(c(6, 4, 2), each = 50) # 同上,生成三种大小
myshape <- rep(16:18, each = 50) # 同上,生成三种形状
p + geom_point(color = mycolor, size = mysize, shape = myshape) # 按顺序分别映射到每一个点上
如果不想自己一个个去映射,直接按照分组来设置呢?
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species, size = Species, shape = Species)) + geom_point()
p
我们可以看到,颜色、大小、形状都是按鸢尾花的品种来区分的,现在我们来自定义一下各个值,这里要引入ggplot2里的一个新元素------标度
scale_*_:
由于我们是按分组变量来区分,因此调用 scale_*_manual 即可
p + scale_color_manual(values = c("#167c80", "#f0cf61", "#371722")) + scale_size_manual(values = c(6, 4, 2)) + scale_shape_manual(values = 16:18)
现在的结果和之前每个点一一分配值是一样的了,而且还自动生成了图例!另外,我们不止可以根据分组,还可以根据一组连续的变量来映射颜色和大小,例如:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width, color = Petal.Length, size = Petal.Width, shape = Species)) + geom_point()
p
这样就根据Petal.Length的数值生成了一组渐变色,以及根据Petal.Width的值来改变点的大小。我们来修改一下颜色,由于用连续型变量,我们用到的标度需改为
scale_*_gradient :
p <- p + scale_color_gradient(low = "#f0cf61", high = "#371722") # 指定最小和最大值对应的颜色,并生成渐变色
p
最大的点太大,怎么调整?只须重新设置一下大小的映射范围,如下:
p <- p + scale_size_continuous(range = c(1, 4)) # 1和4分别对应最小值和最大值的点的大小
p
到这里,点差不多设置好了,再来进行一下美化,背景、网格线、字体、图例等都可以在theme()函数里进行设置,这里先去掉灰色背景:
p + theme(panel.background = element_rect(fill = "white", color = "grey50"), # 将绘图区域背景颜色改为白色,加上深灰色边框
legend.key = element_rect(fill = "white")) # 将图例中图标的背景改为白色
加上网格线:
p + theme(panel.background = element_rect(fill = "white", color = "grey50"), legend.key = element_rect(fill = "white"), panel.grid = element_line(color = "grey92"))
可以看到,theme里面定义各个元素都是用element_*系列函数
- element_blank() 不显示
- element_rect() 边框和背景
- element_line() 线条
- element_text() 文字
具体可以设置的内容详见帮助文档。
如果嫌麻烦的话,ggplot2已经自定义了一些主题如下(更多主题大家可以自己一一尝试):
p + theme_bw() # 直接一行代码实现上面的操作
p + theme_classic()
p + theme_dark()
更多主题,我们还可以安装ggthemes包进行调用,这个我们会在之后的教程里进行介绍。
现在,我们加上标题,修改一下字体大小:
p + theme_bw() + # 切换背景主题
labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") + # 修改X,Y轴标题,加上主标题
theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5), # 调整标题字体大小,改为粗体,使其居中对齐
axis.title = element_text(face = "bold"), # 将坐标轴标题字体加粗
legend.title = element_text(face = "bold"), # 将图例字体加粗
axis.text = element_text(size = 13), # 修改坐标轴标签字体大小
legend.text = element_text(size = 12)) # 设置图例字体大小
如此,简单的一幅图就绘制完成了,总结一下,代码如下:
p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width,
color = Petal.Length, size = Petal.Width,
shape = Species)) +
geom_point() +
scale_color_gradient(low = "#f0cf61", high = "#371722") +
scale_size_continuous(range = c(1, 4)) +
theme_bw() +
labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") +
theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5),
axis.title = element_text(face = "bold"),
legend.title = element_text(face = "bold"),
axis.text = element_text(size = 13),
legend.text = element_text(size = 12))
接下来,直接用ggsave保存到想要的路径下:
ggsave("E:/Temp/Test.png", plot = p, width = 8, height = 5)
或者直接用Rstudio选择想要的图片格式导出:
最后
- 感谢支持,希望对您有帮助!
- 有不足的地方欢迎指正!
- 关注我们,及时获取更多干货!