使用 ggplot2 在 R 中绘制散点图(附示例)
⚡ 智能摘要
在 R 中使用 ggplot2 绘制散点图,通过 geom_point() 将两个连续变量映射到 x 轴和 y 轴。本教程涵盖了组散点图。ping 按颜色、对数变换、拟合回归线、标签、分面、重叠绘图修复、比例尺、主题和保存。
为什么图表在数据分析中如此重要
图表是数据分析过程的第三部分。第一部分是关于 数据示例tracTION第二部分涉及 清理和处理数据最后,数据科学家可能需要 以图表的方式传达他的结果.
下图总结了数据科学家的工作流程。
- 数据科学家的首要任务是确定研究问题。该研究问题取决于项目的目的和目标。
- 之后,最突出的任务之一就是特征工程。数据科学家需要收集、操作和清理数据
- 当这个步骤完成后,他就可以开始探索数据集了。有时,需要根据新的发现来完善和改变原来的假设。
- 当。。。的时候 解释性的 分析完成后,数据科学家必须考虑读者的 理解底层概念和模型.
- 他的结果应该以所有利益相关者都能理解的格式呈现。最好的方法之一是 通信 结果是通过 图形.
- 图表是简化复杂分析的绝佳工具。
本教程的其余部分将使用 ggplot2 包构建这些图表。
ggplot2 包
本教程重点介绍如何使用 ggplot2 在 R 中构建图表。
在本教程中,您将使用 ggplot2 包。该包实现了 Leland Wilkinson 于 2005 年提出的图形语法。ggplot2 非常灵活,自带多种主题,并允许您在极高的层次上指定绘图参数。trac请注意,它不会生成三维或交互式图形;这些需要 plotly 或 rgl 等软件包。
在 ggplot2 中,图形由以下参数组成:
- data
- 美学地图ping
- 几何对象
- 统计变换
- 秤
- 坐标系
- 职位调整
- 刻面
您将在本教程中学习如何控制这些参数。
ggplot2的基本语法是:
ggplot(data, mapping=aes()) + geometric object arguments: data: Dataset used to plot the graph mapping: Control the x and y-axis geometric object: The type of plot you want to show. The most common object are: - Point: `geom_point()` - Bar: `geom_bar()` - Line: `geom_line()` - Histogram: `geom_histogram()`
如何在 R 语言中创建散点图
让我们看看 ggplot 如何与 mtcars 数据集配合使用。首先绘制 mpg 变量和 drat 变量的散点图。
基本散点图
library(ggplot2) ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()
Code 说明
- 首先将数据集 mtcars 传递给 ggplot。
- 在 aes() 参数中,添加 x 轴和 y 轴。
- + 号表示您希望 R 继续阅读代码。通过拆分代码,可以提高代码的可读性。
- 使用 geom_point() 获取几何对象。
输出:
带组的散点图
有时,用一组数据(即因子级数据)来区分值可能会很有趣。
ggplot(mtcars, aes(x = mpg, y = drat)) + geom_point(aes(color = factor(gear)))
Code 说明
- geom_point() 函数内部的 aes() 函数控制每个组的颜色。ping 变量必须是因子,因此 gear 被包装在 factor() 中。
- 总之,您有代码 aes(color = factor(gear)) 来改变点的颜色。
输出:
使用对数变换更改坐标轴刻度
数据重新调整是分析师工作的重要组成部分,因为原始变量很少呈现标准的钟形曲线。取对数是压缩极端值并降低图表对异常值敏感性的一种方法。
ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear)))
Code 说明
- 您可以在 aes() 映射中直接使用 log() 转换 x 和 y 变量。ping.
请注意,可以应用任何其他转换,例如标准化或规范化。
输出:
带拟合值的散点图
您可以向图表中添加另一层信息。您可以将拟合值叠加到图表上。 线性回归.
my_graph <- ggplot(mtcars, aes(x = log(mpg), y = log(drat))) + geom_point(aes(color = factor(gear))) + stat_smooth(method = "lm", col = "#C42126", se = FALSE, size = 1) my_graph
Code 说明
- my_graph:图表存储在 my_graph 对象中,因此后续步骤可以添加图层而无需重复整个调用。
- 参数 stat_smooth() 控制平滑方法
- 方法 = “lm”:线性回归
- col = “#C42126”: Code 这条线的红色
- se = FALSE:不显示标准错误
- size = 1:线条的粗细。在 ggplot2 3.4.0 及更高版本中,此参数已重命名为线条几何形状的 linewidth。
输出:
请注意,还有其他平滑方法可用
- m
- GAM
- loess:观测值少于 1,000 个时的默认方法
- rlm:稳健线性模型,来自 MASS 包
在设置图表样式之前,有必要了解散点图何时才是正确的选择。
散点图 vs 折线图 vs BubblR 中的图表
这三幅图都是绘制两个连续变量之间的关系,所以最终的选择取决于读者应该从中获得什么信息。
| 标准 | 散点图 | 折线图 | Bubbl电子图表 |
|---|---|---|---|
| 作品 | 两个变量之间的相关性 | 有序轴上一个变量的变化 | 相关性加上第三个量级 |
| X轴 | 任何连续变量 | 通常以时间或其他有序尺度来衡量 | 任何连续变量 |
| 点序 | 不相关的 | 关键点相互连接 | 不相关的 |
| 第三个变量 | 通过颜色或形状 | 通过单独的线路 | 通过点尺寸 |
| ggplot2 调用 | geom_point() | geom_line() | geom_point(aes(size = z)) |
当 x 轴没有自然顺序时,用直线连接散点是一个常见的错误:它暗示了一个并不存在的序列。`geom_line()` 函数应该仅用于日期等有序轴。对于单个变量的分布,请使用其他方法。 箱形图 代替。
向图表添加信息
目前这些图表没有任何文字说明。读者应该能够仅从图表数据中理解其含义,而无需查阅其他文档,这意味着图表需要清晰的标签。您可以使用 labs() 函数添加标签。
labs() 函数的基本语法是:
labs(title = "Hello Guru99") arguments: - title: Main title displayed above the plot - subtitle: Secondary line below the title - caption: Note below the plot, usually the data source - x: Rename the x-axis - y: Rename the y-axis - color / fill: Rename the legend Example: labs(title = "Hello Guru99", subtitle = "My first plot")
添加标题
必须添加的信息显然是标题。
my_graph +
labs(
title = "Plot Mile per hours and drat, in log"
)
Code 说明
- my_graph:使用您存储的图表。这样可以避免每次向图表添加新信息时重写所有代码。
- 将标题放在 labs() 函数中。
输出:
添加具有动态名称的标题
动态标题有助于在标题中添加更精确的信息。
您可以使用 paste() 函数打印静态文本和动态文本。paste() 的基本语法是:
paste("This is a text", A) arguments - " ": Text inside the quotation marks are the static text - A: Display the variable stored in A - Note you can add as much static text and variable as you want. You need to separate them with a comma
计费示例:
A <- 2010
paste("The first year is", A)
输出:
## [1] "The first year is 2010"
B <- 2018
paste("The first year is", A, "and the last year is", B)
输出:
## [1] "The first year is 2010 and the last year is 2018"
您可以为我们的图表添加一个动态名称,即mpg的平均值。
mean_mpg <- mean(mtcars$mpg) my_graph + labs( title = paste("Plot Mile per hours and drat, in log. Average mpg is", mean_mpg) )
Code 说明
- 你可以使用存储在 mean_mpg 变量中的 mean(mtcars$mpg) 创建 mpg 的平均值
- 您可以使用 paste() 和 mean_mpg 来创建一个动态标题,返回 mpg 的平均值
输出:
添加字幕
还有两个细节能让图表更清晰易懂。你指的是副标题和图注。副标题位于标题下方。图注可以说明计算者是谁以及数据来源。
my_graph +
labs(
title =
"Relation between Mile per hours and drat",
subtitle =
"Relationship break down by gear class",
caption = "Authors own computation"
)
Code 说明
- 在 labs() 函数内部,你添加了:
- title = “每小时英里和 drat 之间的关系”: 添加标题
- subtitle = “按装备等级划分关系”:添加副标题
- caption = “作者自己的计算:添加标题
- 用逗号分隔每个新信息,,
- 请注意,请拆分代码行。这不是强制性的,它只会帮助更轻松地阅读代码
输出:
重命名 x 轴和 y 轴
列名很少能直接用于图表展示。它们通常被缩写或使用下划线分隔单词,例如 GDP_CAP。请在图表中重命名列名,并在需要的地方添加单位。
my_graph +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code 说明
- 在 labs() 函数内部,你添加了:
- x = “Drat definition”:更改 x 轴的名称
- y =“英里每小时”:更改 y 轴的名称
输出:
控制规模
您可以控制轴的比例。
当你需要创建一个数字序列时,函数 seq() 很方便。基本语法是:
seq(begin, last, by = x)
arguments:
- begin: First number of the sequence
- last: Last number of the sequence
- by= x: The step. For instance, if x is 2, the code adds 2 to `begin-1` until it reaches `last`
例如,范围从 0 到 12,步长为 4,返回四个数字:0、4、8 和 12。
seq(0, 12,4)
输出:
## [1] 0 4 8 12
您可以按如下方式控制 x 轴和 y 轴的比例
my_graph +
scale_x_continuous(breaks = seq(1, 3.6, by = 0.2)) +
scale_y_continuous(breaks = seq(1, 1.6, by = 0.1)) +
labs(
x = "Drat definition",
y = "Mile per hours",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
Code 说明
- 函数 scale_y_continuous() 控制 y轴
- 函数 scale_x_continuous() 控制 x轴.
- 参数 breaks 控制轴的分割,可以手动添加数字序列,也可以使用 seq() 函数:
- seq(1, 3.6, by = 0.2): 创建从 1 到 3.6 的序列,步长为 0.2,即 14 个断点。
- seq(1, 1.6, by = 0.1): 从 1 到 1.6,以 0.1 为步长,生成七个数字。
输出:
主题
最后,ggplot2 允许您使用单个主题函数重新设置整个图表的样式。该软件包自带八个完整的主题:
- theme_bw()
- theme_light()
- theme_classic()
- 主题_线条绘制()
- 主题暗()
- 主题最小()
- 主题灰色()
- theme_void()
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
输出:
保存地块
完成以上步骤后,就可以保存并分享你的图表了。绘图完成后立即调用 `ggsave(“文件名.png”)`,图像就会写入磁盘。
图表保存在工作目录中。要检查工作目录,可以运行以下代码:
directory <- getwd() directory
绘制完成的图表,保存,然后检查结果:
my_graph +
theme_dark() +
labs(
x = "Drat definition, in log",
y = "Mile per hours, in log",
color = "Gear",
title = "Relation between Mile per hours and drat",
subtitle = "Relationship break down by gear class",
caption = "Authors own computation"
)
输出:
ggsave("my_fantastic_plot.png")
输出:
## Saving 5 x 4 in image
注意::仅出于教学目的,我们创建了一个名为 open_folder() 的函数来为您打开目录文件夹。您只需运行下面的代码并查看图片存储的位置。您应该看到一个名为 my_fantastic_plot.png 的文件。
# Run this code to create the function open_folder <- function(dir) { if (.Platform['OS.type'] == "windows") { shell.exec(dir) } else { system(paste(Sys.getenv("R_BROWSER"), dir)) } } # Call the function to open the folder open_folder(directory)
如何在 R 中使用 facet_wrap() 创建分面散点图
分面是前面列出的八个 ggplot2 组件之一,也是解决图表拥挤问题的最简洁方案。ggplot2 不会将所有分组挤进一个面板,而是为每个变量的每个级别绘制多个小面板,所有面板都使用相同的比例尺,从而保证各个面板之间的可比性。
# One panel per gear count ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point() + facet_wrap(~ gear) + theme_classic()
三个论点就能说明大部分问题。
- 恩科尔 or 行:强制面板采用给定的布局,例如 facet_wrap(~ gear, ncol = 2)。
- 秤默认情况下为“固定”,因此所有面板共享一个坐标轴范围。当各组数值差异很大时,请使用“free_y”或“free”,但请注意,自由标度会使面板之间的视觉比较产生误导。
- 贴标机:替换每个条带中的原始因子水平,例如 labeller = label_both 以打印“gear: 4”而不是“4”。
两组ping 变量。 使用 facet_grid() 函数构建面板矩阵,第一个变量按行排列,第二个变量按列排列:
ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point(aes(color = factor(cyl))) + facet_grid(am ~ gear) + theme_classic()
切面还是颜色? 在图表上,颜色标记适用于最多四个重叠区域。超过四个区域,或者区域重叠严重时,分面更易于阅读,因为每个面板只包含自身的数据点。您可以将两者结合使用:使用一个变量进行分面,使用另一个变量进行颜色标记,如上面的 `facet_grid()` 示例所示。
如何处理 R 散点图中的重叠绘图问题
几十个观测点就能让每个点都清晰可见。成千上万个观测点叠加在一起时,标记点会密密麻麻地堆积起来,最密集的区域看起来就像一个实心的斑点。就是这样。 过度绘制ggplot2 提供了四种标准解决方法。
1. 降低不透明度。 最便宜的解决方法。重叠ping 斑点会自然变暗,因此密度会变得可见:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + theme_classic()
2. 抖动离散值。 当一个变量只取少数几个值时,点会落在相同的坐标上。它们之间会存在一个很小的随机位移:
ggplot(mtcars, aes(x = factor(cyl), y = mpg)) + geom_jitter(width = 0.15, height = 0) + theme_classic()
将高度设置为 0,这样承载真实信息的 y 值就不会被改变。
3. 把飞机扔进垃圾堆。 对于大型数据集,统计每个单元格中的观测值数量,并将计数映射到颜色。六边形单元格可以避免正方形单元格产生的视觉瑕疵:
ggplot(diamonds, aes(x = carat, y = price)) + geom_hex(bins = 40) + theme_classic()
4. 绘制密度等值线。 等高线勾勒出观测点集中的区域,并整齐地覆盖在模糊的点上:
ggplot(diamonds, aes(x = carat, y = price)) + geom_point(alpha = 0.05) + geom_density_2d(color = "#C42126") + theme_classic()
一般来说,alpha 可以处理几千个点,六边形分箱可以处理几万个点,而对于更大的点,使用 dplyr::slice_sample() 对数据进行采样是务实的选择。
R语言中的散点图: Code 参考法案
下表列出了上述每种选项对应的 ggplot2 调用:
| 目的 | Code |
|---|---|
| 基本散点图 |
ggplot(df, aes(x = x1, y = y)) + geom_point() |
| 带颜色分组的散点图 |
ggplot(df, aes(x = x1, y = y)) + geom_point(aes(color = factor(x2))) |
| 添加拟合值 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + stat_smooth(method = "lm") |
| 添加标题 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(title = paste("Hello Guru99")) |
| 添加字幕 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(subtitle = paste("Hello Guru99")) |
| 重命名 x |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(x = "X1") |
| 重命名 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + labs(y = "y1") |
| 控制规模 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + scale_y_continuous(breaks = seq(10, 35, by = 10)) + scale_x_continuous(breaks = seq(2, 5, by = 1)) |
| 创建日志 |
ggplot(df, aes(x = log(x1), y = log(y))) + geom_point() |
| 主题 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + theme_classic() |
| 一组人 |
ggplot(df, aes(x = x1, y = y)) + geom_point() + facet_wrap(~ x2) |
| 处理重叠绘图 |
ggplot(df, aes(x = x1, y = y)) + geom_point(alpha = 0.3) |
| 已保存 |
ggsave("my_fantastic_plot.png")
|













