使用 ggplot2 在 R 中绘制散点图(附示例)

⚡ 智能摘要

在 R 中使用 ggplot2 绘制散点图,通过 geom_point() 将两个连续变量映射到 x 轴和 y 轴。本教程涵盖了组散点图。ping 按颜色、对数变换、拟合回归线、标签、分面、重叠绘图修复、比例尺、主题和保存。

  • 📍 基本语法: `ggplot(mtcars, aes(x = drat, y = mpg)) + geom_point()` 根据数据和地图构建图表。ping以及几何学。
  • ???? 集体涂色: 在 geom_point() 内部使用 aes(color = factor(gear)) 将点按因子级别拆分为一种颜色。
  • 📈 趋势线: stat_smooth(method = “lm”) 会叠加一条拟合的回归线,而 se = FALSE 会移除置信带。
  • 🗂️ 刻面: facet_wrap() 在共享比例尺上为每个组绘制一个面板,这比将所有系列挤到一个图表中要好得多。
  • 🔁 过度绘图: 当标记重叠时,降低透明度,抖动点,或切换到 geom_hex()。
  • 💾 出口: ggsave(“plot.png”, width = 8, height = 5, dpi = 300) 将最后一个图表写入工作目录。

使用 R 语言中的 ggplot2 绘制散点图

为什么图表在数据分析中如此重要

图表是数据分析过程的第三部分。第一部分是关于 数据示例tracTION第二部分涉及 清理和处理数据最后,数据科学家可能需要 以图表的方式传达他的结果.

下图总结了数据科学家的工作流程。

  • 数据科学家的首要任务是确定研究问题。该研究问题取决于项目的目的和目标。
  • 之后,最突出的任务之一就是特征工程。数据科学家需要收集、操作和清理数据
  • 当这个步骤完成后,他就可以开始探索数据集了。有时,需要根据新的发现来完善和改变原来的假设。

R 中的散点图

  • 当。。。的时候 解释性的 分析完成后,数据科学家必须考虑读者的 理解底层概念和模型.
  • 他的结果应该以所有利益相关者都能理解的格式呈现。最好的方法之一是 通信 结果是通过 图形.
  • 图表是简化复杂分析的绝佳工具。

本教程的其余部分将使用 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 轴的名称

输出:

重命名 x 轴和 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")

常见问题

`geom_point()` 函数会将每个观测点精确地绘制在其坐标位置。`geom_jitter()` 函数会添加一个微小的随机位移,使得具有相同值的点变得可区分,这在某个坐标轴包含离散值时尤为重要。

在 `aes()` 函数内部,颜色映射是一个变量,因此 ggplot2 会为每个级别分配一个颜色值并生成图例。在 `aes()` 函数外部,颜色是一个固定的常量,应用于每个点,并且不会显示图例。

在 geom_point() 之后添加 stat_smooth(method = “lm”) 或 geom_smooth(method = “lm”)。设置 se = FALSE 以隐藏置信带,并使用 method = “loess” 进行非线性平滑。

散点图揭示了训练前的特征相关性和异常值,它们是显示预测值与实际值对比的标准方法,也是在使用 PCA 或 t-SNE 进行降维后可视化聚类的标准方法。

是的。AI 助手可以绘制图层、建议修复重叠绘图问题,并解释诸如缺少 aes() 包装器之类的错误。请使用您自己的数据运行生成的代码,因为列名和因子类型很容易出错。

总结一下这篇文章: