ggplot2是功能强大且灵活的R包,由Hadley Wickham实现,能够用以绘制精美的图形。
ggplot2
将一张图形分为了3个基本部分:图形(Plot)= 数据(Data)+ 几何对象(Geometry)+ 图形属性(Aesthetics)。可以将其描述为绘图模板,若想生成一张图,只需将以下代码中的尖括号部分替换为数据集、几何对象函数或图像属性映射即可:
ggplot(data = ) +
(mapping = aes())
3个基本部分与尖括号中的内容对应一一对应:
DATA
是数据框GEOM_FUNCTION
为几何对象函数,用以指明需要绘制的图形(如饼图、条形图、折线图等等)MAPPINGS
指明数据框中变量与图形属性如何映射话不多说,让我们从实例出发!
install.packages("tidyverse")
library(ggplot2)
推荐安装tidyverse
,它包含了ggplot2
和其他一些十分好用的包。
install.packages("tidyverse")
library(tidyverse)
首先,我们学习如何绘制散点图。这里我们可以使用ggplot2
包中的mpg
数据框(导入ggplot2
包后即可直接使用),mpg
包含了由美国环境保护协会收集的38中车型的观测数据。
mpg
数据框包含11个变量(列),其中:
manufacturer
表示制造厂商model
表示型号displ
表示发动机排量year
表示制造年份cyl
表示气缸数trans
表示变速器类型drv
表示驱动系统,如前轮驱动(f),后轮驱动®和四轮驱动(4)cty
表示每加仑城市英里数hwy
表示每加仑高速英里数fl
表示燃料类型class
标识车辆类型,如双座、suv等为了探索displ
(发动机排量)与hwy
(每加仑英里数)之间的关系,我们可以绘制散点图,x轴表示displ
,y轴表示hwy
。绘制散点图的几何函数为geom_point
。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
散点图按照我们的要求(x轴表示displ
,y轴表示hwy
)成功绘制。但每个点的颜色是黑色的,并且尺寸太小,可以通过geom_point
函数的color
和size
对其进行设置:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), size=4, color="orange")
对于每个点,如果想在图中标记其cyl
(气缸数),可以使用geom_text
函数:
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy),color="orange") +
geom_text(mapping = aes(x = displ, y = hwy, label = cyl))
可以看到aes(x = displ, y = hwy)
这部分在两个几何对象函数都出现了,显得有些冗余。我们可以将其放入ggplot
函数中:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) +
geom_point(color="orange") +
geom_text(mapping = aes(label = cyl))
后续的几何对象函数可以图形属性映射“共享”,除非在几何对象函数将其覆盖(类似全局变量与局部变量)。
接下来,我们来绘制class
(车辆类型)的条形图:
ggplot(data = mpg, mapping = aes(x = class)) +
geom_bar()
神奇的是,我们只是指明x轴表示class
,就成功将条形图绘制出来了。原因是geom_bar
函数会用统计变换(statistical transformation,stat)算法计算新数据,过程如下:
上面代码等同于:
mpg %>% count(class) %>%
ggplot(mapping = aes(x = class, y = n)) +
geom_bar(stat = "identity") +
labs(y = "count")
其中,mpg %>% count(class)
的结果为:
我们也可以自行设置条形的宽度、边框颜色、填充颜色等属性:
ggplot(data = mpg, mapping = aes(x = class)) +
geom_bar(width = 0.5, color = "red", fill = "steelblue")
给每个条形加上标记:
mpg %>% count(class) %>%
ggplot(mapping = aes(x = class, y = n)) +
geom_bar(stat = "identity", width = 0.5, fill = "steelblue") +
geom_text(aes(label = n), size = 3.5, color = "white", vjust=1.6)
我们可以用fl
(燃料类型)变量用以设置填充颜色:
ggplot(data = mpg, mapping = aes(x = class, fill = fl)) +
geom_bar(width = 0.5) +
coord_flip()
由于x轴上的类别文字可能会重叠在一起,我们使用了coord_flip
函数让x轴与y轴进行翻转。如上图所示,默认情况下会创建一个堆叠的条形图。若不想让图形堆叠,我们可以通过geom_bar
函数的position
参数进行设置:
ggplot(data = mpg, mapping = aes(x = class, fill = fl)) +
geom_bar(width = 0.5, position = position_dodge()) +
coord_flip()
我们可以将class
所占的比例绘制成饼图。计算class
在所有数据中的占比有很多种方法,这里介绍一种:
data <- mpg %>% count(class) %>%
arrange(desc(class)) %>%
mutate(prop = n / sum(n),
ypos = cumsum(prop)- 0.5*prop)
data
接下来,按照下面代码绘制饼图:
pie <- data %>%
ggplot(aes(x = "", y = prop, fill = class)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start = 0)
pie
coord_polar
函数将普通的直角坐标系换成了极坐标系。但上图包含了许多没必要的信息,例如:x轴名称,y轴刻度等等。我们可以创建一个主题对图形整体进行设置:
blank_theme <- theme_minimal()+
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.border = element_blank(),
panel.grid=element_blank(),
axis.ticks = element_blank(),
axis.text.x = element_blank(),
plot.title=element_text(size=14, face="bold")
)
pie + blank_theme
图形现在“整洁”了不少,我们可以给每块区域加上标记,用于指明其具体占比数:
library(scales)
pie + blank_theme +
geom_text(aes(y = ypos, label = percent(prop)), color = "white", size=3)
最后,附上ggplot2
的简明参考手册。
感兴趣的同学推荐下载一下哦!
The R Graph Gallery: https://www.r-graph-gallery.com/
R Graphics Cookbook, 2nd edition: https://r-graphics.org/
ggplot2: Elegant Graphics for Data Analysis: https://ggplot2-book.org/index.html
R for Data Science: https://r4ds.had.co.nz/index.html
Drawing bar plots with percentages instead of counts
http://www.sthda.com/english/wiki/ggplot2-essentials
《ggplot2:数据分析与图形艺术》
《R数据科学》
同载于:https://andyfree96.github.io/2021/05/09/3811884b/