【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

前言
R 中最受欢迎的绘图库之一不是 R base 自带的绘图函数,而是 ggplot2 库。人们使用它是因为它非常灵活。该库遵循“图形语法(grammar of graphics)”的理念,即不是通过函数调用直接生成可视化,而是先定义图中应包含的元素,然后在生成图片前进一步调整。
在本文中,你将学习 ggplot2 并看到一些示例。具体来说,你将学到:
-
如何利用 ggplot2 从数据集创建图表
-
如何使用 ggplot2 创建带有多种视角的各种图表
本文分为两部分:
-
ggplot2 入门
-
ggplot2 绘图示例
ggplot2 入门
首先,你需要在 R 环境中安装 ggplot2:
install.packages("ggplot2")
安装完成后,需要加载库才能使用其功能:
library(ggplot2)
一个 ggplot2 的示例是加载简单的数据集,例如 iris 分类数据集,并绘制图表:
iris |> ggplot() + geom_point(aes(x=Petal.Width, y=Petal.Length, color=Species))
这里首先用数据集 iris 创建一个绘图对象,但此时它是一个空白画布。接着,你希望在画布上添加散点图,即将数据点绘制为单独的点。通过向 ggplot 对象添加 geom_point(),并使用 aes() 指定每个点的坐标和颜色,就可以实现这一点。
该图表的输出结果如下:

这确实是一个可以赋值给变量的绘图对象。为了展示图形语法(grammar of graphics)的理念,你会注意到两个坐标轴默认是以数据列名作为标签的,同时你也可以为坐标轴标签和主题添加修饰:
picture <- iris |> ggplot() + geom_point(aes(x=Petal.Width, y=Petal.Length, color=Species))
picture <- picture + labs(title="Scatter plot of iris dataset",
x="Petal width/cm",
y="Petal lenght/cm") + theme_classic()
picture
这样你将得到一张略有不同的图表:

如果你想在图表上叠加不同的图形或者改变某些样式,只需向绘图对象添加相应的修饰函数即可。
ggplot2 绘图示例
下面我们通过一些实例进一步了解 ggplot2 的使用方法。
我们以 mtcars 数据集为例。该数据集内容如下所示:
print(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
...
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
该数据集共有 32 行,每行包含 11 个属性。这里我们只考虑 mpg(每加仑英里数)这一列,并创建直方图和密度图示例:
ggplot(mtcars, aes(x=mpg, y=..count..)) + geom_histogram(bins=10) + geom_density()
这里的代码解释如下:
-
ggplot(mtcars, aes(x=mpg, y=…count…)):使用 mtcars 数据集创建绘图对象,将 mpg 列映射到 x 轴,计数映射到 y 轴。
-
geom_histogram(bins=10):绘制 10 个区间的直方图,显示 mpg 分布。
-
geom_density():在同一图上叠加密度曲线,显示数据的平滑分布趋势。
通过这种方式,你可以轻松在同一张图中叠加不同图层,从而实现更丰富的可视化效果。

在这里,你可以看到如何在同一张图表上叠加两种不同的图形。另一个你可能会觉得有用的例子是,将散点图与线性回归叠加:
ggplot(mtcars, aes(x=wt, y=mpg)) + geom_point() + geom_smooth(method=lm)

你定义了一个带有指定 x 轴和 y 轴的 ggplot 对象。然后绘制点和拟合平滑线。注意,在 geom_smooth() 中需要使用 method=lm 才能得到直线。默认情况下,它相当于 method=loess,会使用局部加权回归平滑(locally estimated scatterplot smoothing)算法生成曲线。
有时,你可能希望绘制三个不同的属性。与其使用 3D 图,不如在一个二维图中使用多个分面(facets),前提是其中一个属性是分类变量。下面是一个示例,将 mpg 对 wt 绘图,并按 cyl 的不同值进行分面:
ggplot(mtcars, aes(wt, mpg)) + geom_point() + facet_grid(rows=vars(cyl))

注意,如果你希望使用列分面,可以将上面的 rows= 参数替换为 cols=。分面图的一个缺点是,图表必须具有相似性质。如果你想在保持最高灵活性的情况下将两个不同的图表并排显示,可以使用 cowplot 包:
library(cowplot)
left <- ggplot(mtcars, aes(group=cyl, x=cyl, y=mpg)) + geom_boxplot() + theme_bw()
right <- ggplot(mtcars, aes(wt, mpg)) + geom_point() + geom_smooth(method=lm)
plot_grid(left, right)
这将生成如下图表:

总结
在本文中,你学习了 R 中的 ggplot2 库。具体来说,你学到了:
-
如何使用图形语法(grammar of graphics)创建图表
-
如何使用 ggplot2 创建散点图、折线图和直方图
-
如何在同一张图表中创建多个图形

7180

被折叠的 条评论
为什么被折叠?



