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

R语言中的条形图是什么?
条形图是显示 x 轴上的分类变量的绝佳方式。这种类型的图表在 y 轴上表示两个方面。
- 第一个统计的是每组中出现的次数。
- 第二张图显示了 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) |













