R语言中的条形图和直方图示例

⚡ 智能摘要

R 语言中的条形图和直方图使用 ggplot2 构建,分别使用 geom_bar() 函数绘制分类计数数据,使用 geom_histogram() 函数绘制连续分布数据。本教程将指导您如何自定义颜色、分组等信息。ping对 mtcars 数据集进行堆叠、方向、分箱和条形标签处理。

  • 📊 核心区别: 条形图概括了分类变量,而直方图则将单个连续变量划分成不同的区间。
  • 🧱 图形语法: 每个图表都结合了一个数据集和一个 aes() 映射。ping以及用加号连接的几何图形。
  • ???? 色彩控制: 将 fill 放在 geom_bar() 中可获得单一颜色,放在 aes() 中可按组为条形着色。
  • 📐 位置调整: position = “fill” 将计数转换为百分比,position_dodge() 将分组条形并排放置。
  • 🔢 绘制数值: 当 y 轴已经包含计算出的统计量(例如组均值)时,传递 stat = “identity”。
  • 📏 直方图分箱: 在 geom_histogram() 中设置 bins 或 binwidth,因为默认的 30 个 bin 很少适合数据。

R语言中的条形图直方图

R语言中的条形图是什么?

条形图是显示 x 轴上的分类变量的绝佳方式。这种类型的图表在 y 轴上表示两个方面。

  1. 第一个统计的是每组中出现的次数。
  2. 第二张图显示了 y 轴上某个变量的汇总统计信息(最小值、最大值、平均值等)。

您将使用 mtcars 数据集,该数据集包含以下变量:

  • cyl:汽车气缸编号。数值变量
  • am:变速器类型。0 表示自动,1 表示手动。数值变量
  • mpg:英里/加仑。数值变量

由于直方图看起来非常相似,因此在编写任何代码之前,有必要先解决它们之间的差异。

R语言中的条形图与直方图:主要区别

这两张图表看起来很像,但人们却经常把它们混淆。它们回答的问题不同,使用的几何图形也不同。

标准 Bar Chart 直方图
X轴变量 类别或因素 连续和数值
条形图代表什么 一类 一个区间,或称箱体,包含若干数值
杆之间的缝隙 是的,类别是分开的。 不,垃圾箱就在旁边。
酒吧订单 可以自由重新排列 由数值尺度决定
问题已解答 各组之间有何区别? 一个变量是如何分布的?
ggplot2 对象 geom_bar() geom_histogram()

经验法则:如果重新排列柱状图的顺序仍然有意义,那么这就是柱状图。如果重新排列柱状图的顺序会破坏其意义,那么这就是直方图。对于同一连续变量的四分位数汇总,请使用直方图。 箱形图.

如何在 R 语言中创建条形图

创建图表 R,您可以使用 ggplot 库来创建可发布的图表。这个库的基本语法是:

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 objects are:

- Point: `geom_point()`
- Bar: `geom_bar()`
- Line: `geom_line()`
- Histogram: `geom_histogram()` 

本教程重点介绍几何对象 geom_bar()(用于绘制条形图)和 geom_histogram()(用于处理连续数据)。

条形图:计数

您的第一张图表使用 geom_bar() 显示了圆柱体的频率。下面的代码是最基本的语法。

library(ggplot2)
# Most basic bar chart
ggplot(mtcars, aes(x = factor(cyl))) +
    geom_bar()

Code 说明

  • 您将数据集 mtcars 传递给 ggplot。
  • 在 aes() 参数中,您将 x 轴设置为因子变量 cyl。
  • + 号表示您希望 R 继续阅读代码。通过拆分代码,可以提高代码的可读性。
  • 使用 geom_bar() 获取几何对象。

输出:

条形图:计数

注意::确保将变量转换为因子,否则 R 会将变量视为数字。请参阅下面的示例。

条形图:计数

自定义图表

可以传递四个参数来定制图表:

- `stat`: Controls what is plotted on the y-axis. By default `count`, which tallies rows. To plot a value you already computed, pass `stat = "identity"`
- `alpha`: Control density of the color
- `fill`: Change the color of the bar
- `size`: Control the size the bar	

更改条形的颜色

您可以更改条形的颜色。请注意,条形的颜色都是相似的。

# Change the color of the bars
ggplot(mtcars, aes(x = factor(cyl))) +
    geom_bar(fill = "coral") +
    theme_classic()

Code 说明

  • 条形图的颜色由 aes() 映射控制。ping 在几何对象内部(即不在 ggplot() 函数内部)。您可以使用填充参数更改颜色。这里,您选择珊瑚色。

输出:

更改条形的颜色

你可以使用这个代码:

grDevices::colors()

查看 R 中所有可用的颜色。大约有 650 种颜色。

改变强度

您可以增加或减少条形颜色的强度

# Change intensity
ggplot(mtcars,
        aes(factor(cyl))) +
    geom_bar(fill = "coral",
        alpha = 0.5) +
    theme_classic()

Code 说明

  • 要增加/减少条形的强度,您可以更改 alpha 值。较大的 alpha 值会增加强度,较小的 alpha 值会降低强度。alpha 值的范围为 0 到 1。当 alpha 值为 1 时,颜色与调色板完全匹配;当 alpha 值为 0 时,条形完全不可见。这里您选择 alpha = 0.5。

输出:

改变强度

按组着色

您可以更改条形的颜色,即每组使用一种不同的颜色。例如,cyl 变量有三个级别,那么您可以使用三种颜色绘制条形图。

# Color by group
ggplot(mtcars, aes(factor(cyl),
        fill = factor(cyl))) +
    geom_bar()

Code 说明

  • aes() 函数内部的 fill 参数用于改变柱状图的颜色。您可以通过设置 fill = x 轴变量来改变颜色。在您的示例中,x 轴变量为 cyl;fill = factor(cyl)

输出:

按组着色

在栏目中添加群组

您可以根据另一个因子级别进一步拆分 y 轴。例如,您可以根据气缸类型计算自动和手动变速器的数量。

您将按如下方式进行:

  • 步骤 1:使用 mtcars 数据集创建数据框
  • 步骤 2:将 am 变量标记为 auto(自动变速器)和 man(手动变速器)。将 am 和 cyl 转换为因子,这样您就无需在 ggplot() 函数中使用 factor()。
  • 步骤 3:绘制条形图来统计按气缸计算的变速器数量
library(dplyr)
# Step 1
data <- mtcars %>% 
#Step 2
mutate(am = factor(am, labels = c("auto", "man")),
    cyl = factor(cyl))

数据集准备就绪后,即可绘制图表:

# 第3步

ggplot(data, aes(x = cyl, fill = am)) +
    geom_bar() +
    theme_classic()

Code 说明

  • ggplot() 调用接收数据集数据和 aes() 映射。ping.
  • 在 aes() 中包含变量 x 轴以及填充条形所需的变量(即 am)
  • geom_bar():创建条形图

输出:

在栏中添加组

地图ping 柱状图将填充两种颜色,每种颜色代表一个级别。只需选择数据集中的其他因子变量,即可轻松更改分组。

百分比条形图

您可以以百分比而不是原始计数来显示该条形图。

# 百分比条形图

ggplot(data, aes(x = cyl, fill = am)) +
    geom_bar(position = "fill") +
    theme_classic()

Code 说明

  • 在 geom_bar() 参数中使用 position =“fill” 来创建 y 轴上有百分比的图形。

输出:

百分比条形图

并排栏

绘制带有组变量的条形图很容易。

# Bar chart side by side
ggplot(data, aes(x = cyl, fill = am)) +
    geom_bar(position = position_dodge()) +
    theme_classic()

Code 说明

  • position=position_dodge():明确说明如何排列条形图

输出:

并排栏

带有汇总统计信息的条形图

在本教程的第二部分,y 轴显示的是计算值而非计数。请注意,这仍然是条形图:真正的直方图将在后面介绍,它使用不同的几何对象。

您的目标是创建一个图表,其中包含每种气缸的平均每加仑英里数。要绘制信息图表,您需要遵循以下步骤:

  • 步骤 1:创建一个新变量,其中包含每个气缸的平均每加仑英里数
  • 步骤 2:创建基本直方图
  • 步骤 3:更改方向
  • 第 4 步:更改颜色
  • 步骤 5:更改大小
  • 步骤 6:向图表添加标签

步骤1) 创建一个新变量

您创建一个名为 data_histogram 的数据框,它仅返回汽车气缸数的每加仑平均英里数。您将这个新变量命名为 mean_mpg,并将平均值四舍五入为两位小数。

# 第1步

data_histogram <- mtcars %>%
mutate(cyl = factor(cyl)) %>%
group_by(cyl) %>%
summarize(mean_mpg = round(mean(mpg), 2))

步骤2) 创建基本直方图

您可以绘制直方图。虽然它还不够完善,不能交给客户,但已经显示出趋势了。

ggplot(data_histogram, aes(x = cyl, y = mean_mpg)) +
    geom_bar(stat = "identity")

Code 说明

  • aes() 现在有两个变量。cyl 变量表示 x 轴,mean_mpg 表示 y 轴。
  • 您传递 stat = “identity” 参数,以便 geom_bar() 函数直接使用 y 轴变量,而不是计算行数。geom_bar() 函数的默认值为 stat = “count”。

输出:

直方图

步骤3) 更改方向

您将图形的方向从垂直更改为水平。

ggplot(data_histogram, aes(x = cyl, y = mean_mpg)) +
    geom_bar(stat = "identity") +
    coord_flip()

Code 说明

  • 您可以使用 coord_flip() 控制图形的方向。

输出:

直方图

步骤4) 改变颜色

您可以根据 x 轴变量的因子水平来区分条形的颜色。

ggplot(data_histogram, aes(x = cyl, y = mean_mpg, fill = cyl)) +
    geom_bar(stat = "identity") +
    coord_flip() +
    theme_classic()

Code 说明

  • 您可以使用 fill= cyl map 按组绘制图形。pingR 会根据 cyl 变量的级别自动处理颜色。

输出:

直方图

步骤5) 改变大小

为了使图表看起来更漂亮,您可以减小条形的宽度。

graph <- ggplot(data_histogram, aes(x = cyl, y = mean_mpg, fill = cyl)) +
    geom_bar(stat = "identity",
        width = 0.5) +
    coord_flip() +
    theme_classic()

Code 说明

  • geom_bar() 函数中的 width 参数控制柱状图的粗细。值越大,柱状图越宽。
  • 该图表存储在对象图中,因为下一步会直接重用它。存储中间图表可以提高代码的可读性。

输出:

直方图

步骤6) 向图表添加标签

最后一步是将 mean_mpg 的值作为标签添加到每个柱状图中。

graph +
    geom_text(aes(label = mean_mpg),
        hjust = 1.5,
        color = "white",
        size = 3) +
    theme_classic()

Code 说明

  • 函数 geom_text() 对于控制文本的美观很有用。
    • label=: 在栏内添加标签
    • mean_mpg:使用变量mean_mpg作为标签
  • hjust 控制标签在柱状图上的位置。接近 1 的值会将其放置在柱状图的末端附近,较大的值则会将其推向坐标轴。如果图表方向为垂直,请将 hjust 更改为 vjust。
  • color=”white”:更改文本的颜色。这里使用白色。
  • size=3:设置文本的大小。

输出:

直方图

如何在 R 语言中对条形图中的条形进行排序和标记

草稿图表与可发布的图表之间还有两项最后的润色:按数值对柱状图进行排序和正确标注坐标轴。

重新排列酒吧。 ggplot2 默认按字母顺序排列因子水平,但这通常不是最能体现信息量的顺序。将 x 变量放在 reorder() 函数中,即可按第二个变量排序:

# Sort the bars from lowest to highest mean_mpg
ggplot(data_histogram, aes(x = reorder(cyl, mean_mpg), y = mean_mpg)) +
    geom_bar(stat = "identity", fill = "coral") +
    theme_classic()

在排序变量前加上减号,reorder(cyl, -mean_mpg),以反转排序方向。

添加标题和坐标轴标签。 labs() 函数一次调用即可设置所有文本元素:

ggplot(data_histogram, aes(x = cyl, y = mean_mpg, fill = cyl)) +
    geom_bar(stat = "identity") +
    labs(title = "Average fuel economy by cylinder count",
        subtitle = "mtcars dataset",
        x = "Number of cylinders",
        y = "Mean miles per gallon",
        fill = "Cylinders",
        caption = "Source: mtcars") +
    theme_classic()

在 labs() 函数内部设置 fill = NULL 可以完全删除图例标题,而当 x 轴已经命名了组别时,使用 theme(legend.position = “none”) 可以删除图例。

选择你喜欢的颜色。 将默认调色板替换为指定的调色板,使图表与您的房屋风格相匹配:

scale_fill_manual(values = c("4" = "#0e9cd1", "6" = "coral", "8" = "grey40"))

如何在 R 中使用 geom_histogram() 创建直方图

直方图展示了单个连续变量的分布情况。ggplot2 不是统计类别数量,而是将数值范围分割成若干个区间,并统计每个区间内的观测值数量。

library(ggplot2)
# Most basic histogram
ggplot(mtcars, aes(x = mpg)) +
    geom_histogram()

R 会打印一条消息,建议您选择更合适的箱数,因为默认的 30 个箱数是任意的。有两个参数可以控制这一点:

  • 垃圾箱:将范围分割成的区间数。
  • 箱宽:每个区间的宽度,以变量的单位表示。当单位有意义时,请使用此值。
# Set the number of bins
ggplot(mtcars, aes(x = mpg)) +
    geom_histogram(bins = 10, fill = "coral", color = "white") +
    theme_classic()

# Or set the width of each bin instead
ggplot(mtcars, aes(x = mpg)) +
    geom_histogram(binwidth = 4, fill = "coral", color = "white") +
    theme_classic()

在直方图中,分箱是最重要的选择。分箱太少会掩盖真实的结构,例如第二个峰值;分箱太多则会使图表变成噪声。在确定最终值之前,请尝试几个不同的分箱值。

比较各组。 将因子映射到填充区域并设置位置,以保持分布的可读性:

ggplot(mtcars, aes(x = mpg, fill = factor(cyl))) +
    geom_histogram(bins = 10, position = "identity", alpha = 0.5) +
    theme_classic()

当 position = “identity” 并降低 alpha 值时,直方图会重叠,因此您可以直接比较形状。如果您希望并排查看各个直方图,请使用 position = “dodge”。

密度而非数量。 当各组大小不同时,绘制密度图,使面积具有可比性,并叠加一条平滑曲线:

ggplot(mtcars, aes(x = mpg)) +
    geom_histogram(aes(y = after_stat(density)), bins = 10,
        fill = "coral", alpha = 0.6) +
    geom_density(color = "steelblue", linewidth = 1) +
    theme_classic()

R语言中的条形图和直方图: Code 参考法案

条形图适用于分类 x 轴,其中 y 轴可以是计数或汇总统计量。下表列出了上述每种变体的 ggplot2 调用:

目的 Code
计数
ggplot(df, aes(x = factor(x1))) + geom_bar()
用不同的填充颜色进行计数
ggplot(df, aes(x = factor(x1), fill = factor(x1))) + geom_bar()
分组计数、堆叠
ggplot(df, aes(x = factor(x1), fill = factor(x2))) + geom_bar()
并排计数
ggplot(df, aes(x = factor(x1), fill = factor(x2))) + geom_bar(position = position_dodge())
按组计数,以 % 形式堆叠
ggplot(df, aes(x = factor(x1), fill = factor(x2))) + geom_bar(position = "fill")
数值(汇总统计量)
ggplot(df, aes(x = factor(x1), y = x2)) + geom_bar(stat = "identity")
连续变量的直方图
ggplot(df, aes(x = x1)) + geom_histogram(bins = 30)

常见问题

当 x 轴变量为连续变量且你想查看其分布情况时,请使用直方图。当 x 轴代表不同的类别且你想比较这些类别时,请使用条形图。

在 `aes()` 函数内部,`fill` 函数将一个变量映射到颜色,因此每个组都有自己的颜色深浅。而在 `aes()` 函数外部,在 `geom_bar()` 函数内部,`fill` 是一个固定值,应用于每个柱状图。

没有通用的答案。先从观测值的平方根开始,然后进行调整。分箱太少会掩盖诸如第二个峰值之类的结构,而分箱太多则会产生噪声过大、尖峰过多的图表。

直方图是人工智能项目探索性数据分析的标准第一步,它可以在模型训练之前揭示数据偏斜、异常值和类别不平衡等问题。条形图则用于总结特征重要性和类别频率。

是的。AI 助手可以根据图表的简单描述生成 ggplot2 图层,并解释诸如缺少统计参数之类的错误。务必使用您自己的数据运行生成的代码以验证图表。ping 是正确的。

总结一下这篇文章: