Skip to content

R - 条形图

条形图使用矩形条形来表示分类数据,每个条形的长度与其所代表的值成比例。它是比较不同组之间值最常见且有效的方法之一。

与其他可视化图表一样,ggplot2 包是 R 中的现代标准。它提供了一个强大且声明式的系统,用于创建复杂的条形图。我们将重点关注两种主要的几何对象:geom_bar() 和 geom_col()。

ggplot2 做出了一个重要的区分:

  • geom_col():当您拥有一个数据帧,其中一列代表类别(x 轴),而另一列代表条形高度(y 轴)时,使用此函数。这是绘制汇总数据最常见的场景。
  • geom_bar():当您希望 ggplot2 计算单个列中每个类别的计数并使用这些计数作为条形高度时,使用此函数。它本质上是为分类数据创建直方图的快捷方式。

示例:从汇总数据创建条形图(geom_col)

Section titled “示例:从汇总数据创建条形图(geom_col)”

让我们创建一个显示月度收入的条形图。我们的数据已汇总,因此我们将使用 geom_col()。

# 加载必要的库
library(ggplot2)
library(tibble)
# 创建一个 tibble,包含我们的数据
monthly_revenue <- tibble(
month = c("Mar", "Apr", "May", "Jun", "Jul"),
revenue = c(27000, 32000, 28000, 39000, 41000)
)
# 创建条形图
revenue_chart <- ggplot(data = monthly_revenue, aes(x = month, y = revenue)) +
geom_col(fill = "#2E86C1", width = 0.7) + # 对预先存在的值使用 geom_col
labs(
title = "Monthly Revenue Performance",
subtitle = "Q2 2023",
x = "Month",
y = "Revenue (in USD)"
) +
# 根据月份在数据中的出现顺序重新排序,而不是按字母顺序
scale_x_discrete(limits = monthly_revenue$month) +
# 将 y 轴标签格式化为货币样式
scale_y_continuous(labels = scales::dollar_format()) +
theme_minimal()
# 显示图表
print(revenue_chart)
# 保存图表
ggsave("monthly_revenue_chart.png", width = 7, height = 5)

此代码生成一个专业的条形图。x 轴正确地按数据帧中出现的顺序排列月份。y 轴以货币形式显示收入(例如,“$30,000”)。条形为蓝色,标题提供了清晰的上下文。

ggplot2 的一个关键优势在于它能够通过将变量映射到 fill 等美学属性来创建复杂的图表。这使得创建分组或堆叠条形图变得异常简单。我们只需确保数据采用“长”格式。

# 加载库
library(ggplot2)
library(tibble)
# 以“长”格式创建数据,这非常适合 ggplot2
regional_revenue <- tibble(
month = rep(c("Mar", "Apr", 'May'), each = 3),
region = rep(c("East", "West", "North"), times = 3),
revenue = c(2, 9, 3, 11, 9, 4, 8, 7, 3) * 1000
)
# 创建一个堆叠条形图(默认)
stacked_chart <- ggplot(regional_revenue, aes(x = month, y = revenue, fill = region)) +
geom_col() + # `fill = region` 告诉 ggplot 按区域着色并堆叠条形
labs(title = "Stacked Revenue by Region", x = "Month", y = "Total Revenue") +
theme_classic()
print(stacked_chart)
# 创建一个分组(或“并排”)条形图
grouped_chart <- ggplot(regional_revenue, aes(x = month, y = revenue, fill = region)) +
# position = "dodge" 将条形并排放置
geom_col(position = "dodge") +
labs(title = "Grouped Revenue by Region", x = "Month", y = "Revenue") +
# 使用对色盲人士友好的调色板
scale_fill_brewer(palette = "Set2") +
theme_bw()
print(grouped_chart)

执行此代码会生成两个图表。第一个是堆叠条形图,其中每个月的来自不同区域的收入相互堆叠,显示总计。第二个是分组条形图,其中每个区域的条形每月并排放置,使得区域之间的直接比较更容易。ggplot2 会自动为 region 变量创建图例。