ggplot2图形艺术: 1. 绘图基础
Hadley Wickham大神的ggplot2. Elegant Graphics for Data Analysis
原版已经推到了第三版,https://ggplot2-book.org/index.html
决定温故而知新。再来整理一遍。
在这一章节的内容里会学习到以下内容。
- 用
mpg
数据集进行ggplot2
可视化 -
ggplot
三要素: 数据,映射,图形 - 如何给plot添加变量
- 如何运用分面将数据拆分
- 如何制定不同的几何对象
- 如何修改坐标轴
- 如何保存图像文件
0624
1. 知识要点
ggplot2图像三要素:
- 数据
- 图形属性映射(设定变量如何映射到图层的图形属性上)
- 几何对象(至少一层,用于指定绘图所用的几何对象)
下面举一个最简单的例子。
ggplot(mpg,aes(x=displ,y=hwy)) + geom_point()
1.数据:mpg
2.图形属性映射: 发动机尺寸对应x轴,耗油量对应y轴
3.几何对象: 散点图
这是一个最典型的范例,随着学习的深入,到时候可以添加更多的组件来使图形更加丰富形象。
2.颜色,大小,形状和其他图形属性
这些图形属性的设置方法与x和y相同,而其同样需要写入aes()
函数中。
- aes(displ, hwy, colour = class)
- aes(displ, hwy, shape = drv)
- aes(displ, hwy, size = cly)
比方说举个例子,把class
映射成颜色。
ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point()
可以看出,ggplot2通过
colour scale
把数据class自动转换成了不同种类的颜色。在之后的章节里会详细介绍colour scale
的设置方法。如果这里你想把颜色设置成一种,可以观察一下下面的代码。
ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = "blue"))
ggplot(mpg, aes(displ, hwy)) + geom_point(colour = "blue")
把"blue"设置在
aes
里的时候,"blue"被scale
转换成了默认的粉红色,并自动生成了图标。当不设置属性也就是
aes
的时候,blue
就变成了他本来应该的样子,也就是第二张图里的蓝色。不同类别的变量会对应不同类型的图形属性。比如分类变量映射为颜色和形状,连续变量会映射为大小。其实也并不是属性用的越多越好,要记住simple is the best,与其画出一副信息冗杂的图像,还不如绘制一组简单易懂的。
3. 分面
分面分为两种,网格型和封装型。由于网格型最为常用,所以在此简单介绍一下网格型的用法,以后会讨论到封装型。只需要对图像进行分面处理facet_wrap()
,括号中输入~
和分类变量。
ggplot(mpg,aes(displ,hwy)) + geom_point() + facet_wrap(~class)
4. 几何对象
几何对象就是geom_point()
里的内容。你想要展示的图形。这里会介绍最常用的几款。
-
geom_smooth()
平滑曲线 -
geom_boxplot()
箱图 -
geom_histogram()
,geom_freqpoly()
展现连续变量的分布 -
geom_bar()
棒状图 -
geom_path()
和geom_line()
折线图
4.1 添加平滑曲线
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth()
图中的灰色部分是se也就是置信区间。如果不想显示置信区间,可以用
geom_smooth(se=FALSE)
来去掉。在数据量比较小时,默认的method是lowess平滑曲线,可以通过span设置平滑程度。
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth(span=0.2)
当然也可以改变曲线的种类,比方说用直线
lm
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth(method="lm")
4.2 箱图和扰动点图
- 扰动点图
ggplot(mpg, aes(drv, hwy)) +
geom_jitter()
- 箱图
ggplot(mpg, aes(drv, hwy)) +
geom_boxplot()
- 小提琴图
ggplot(mpg, aes(drv, hwy)) +
geom_violin()
扰动点图 | 箱图 | 小提琴图 |
---|---|---|
- tips:
reorder()
排序
根据hwy
的大小给class
排列顺序展示。
ggplot(mpg, aes(reorder(class, hwy), hwy)) + geom_boxplot()
4.3 直方图和频数图
- 直方图
ggplot(mpg, aes(hwy)) + geom_histogram()
- 频数图
ggplot(mpg, aes(hwy)) + geom_freqpoly()
直方图 | 频数图 |
---|---|
当然也可以添加颜色映射或者分面展示。
ggplot(mpg, aes(displ, colour = drv)) + geom_freqpoly(binwidth = 0.5) | ggplot(mpg, aes(displ, fill = drv)) + geom_histogram(binwidth = 0.5) + facet_wrap(~drv, ncol = 1) |
---|---|
4.4 棒状图
离散变量情况下,条形图和直方图类似,通过geom_bar()
绘制。
ggplot(mpg,aes(manufacturer)) + geom_bar()
如果是连续变量,可以指定stat="identity"
。假设有三种药物,每种药物有对应的效果数值,用棒状图来展现一下。
drugs <- data.frame(
drug = c("a", "b", "c"),
effect = c(4.2, 9.7, 6.1)
)
ggplot(drugs, aes(drug, effect)) + geom_bar(stat = "identity")
4.5 折线图
折线图经常被用来展现时间序列的数据。比如说美国过去40年的经济数据economics
。
左图展示的是失业数字/总人口数也就是失业率。右图展示的是事业总人口。
ggplot(economics, aes(date, unemploy / pop)) + geom_line() | ggplot(economics, aes(date, uempmed))+geom_line() |
---|---|
为了观察更多的细节,可以把上面的两张图里的信息放在一起。其中用颜色来映射时间变量。
year <- function(x) as.POSIXlt(x)$year + 1900
ggplot(economics, aes(unemploy / pop, uempmed)) +
geom_path(colour = "grey50") +
geom_point(aes(colour = year(date)))
4.6 修改坐标轴
之后会有专门的章节介绍坐标轴的修改以及修饰。这里简单说明一下最常用的两组参数xlab()````ylab()
和xlim()````ylim()
。
ggplot(mpg, aes(cty, hwy)) + geom_point(alpha = 1 / 3) | ggplot(mpg, aes(cty, hwy)) + geom_point(alpha = 1 / 3) + xlab("city driving (mpg)") + ylab("highway driving (mpg)") | ggplot(mpg, aes(cty, hwy)) + geom_point(alpha = 1 / 3) + xlab(NULL) + ylab(NULL) |
---|---|---|
ggplot(mpg, aes(drv, hwy)) + geom_jitter(width = 0.25) | ggplot(mpg, aes(drv, hwy)) + geom_jitter(width = 0.25) + xlim("f", "r") + ylim(20, 30) | ggplot(mpg, aes(drv, hwy)) + geom_jitter(width = 0.25, na.rm = TRUE) + ylim(NA, 30) |
---|---|---|
4.7 保存
大多数情况下图像可以直接显示出来,但也可以保存为一个变量并对其进行修改。
p <- ggplot(mpg, aes(displ, hwy, colour = factor(cyl))) +
geom_point()
- 使用
ggsave()
进行保存
ggsave("plot.png", p, width = 5, height = 5)
本章完