R 绘图 – 条形图(完整指南)

R 绘图 – 条形图:从零开始掌握数据可视化基础

在数据分析的世界里,条形图是最直观、最常用的图表之一。它就像一张“数据快照”,用长短不一的条形,把数量的大小关系一目了然地展现出来。无论是对比不同产品的销量,还是展示各地区的人口分布,条形图总能快速传递信息。今天,我们就来深入学习 R 语言中的条形图绘制,从基础语法到高级定制,手把手带你掌握这项核心技能。

你可能已经用过 Excel 做过条形图,但 R 的强大之处在于——它能自动化、批量处理复杂数据,并生成高质量、可复用的图形。掌握 R 绘图,尤其是条形图,是迈向数据科学的第一步。


为什么选择 R 绘图 – 条形图?

R 语言天生为统计分析和可视化而生,其内置的 graphics 包提供了基础绘图功能,而 ggplot2 这个更现代的包则让绘图更加灵活、美观。条形图作为最基础的可视化形式,是学习 R 绘图的绝佳切入点。

想象一下,你有一份销售数据,包含 5 个城市的月度销售额。如果用文字列出这些数字,你需要一个一个去比对。但当你把它们画成条形图,一眼就能看出哪个城市卖得最多、哪个最弱。这就是可视化的力量。

在 R 中,barplot() 函数是绘制条形图的核心工具,而 ggplot2 则提供了更强大的语法体系。我们先从最基础的 barplot() 开始,再逐步进阶。


创建基础条形图:从数据到图形

我们先准备一组简单的数据,模拟 5 个城市的月销售额(单位:万元):

cities <- c("北京", "上海", "广州", "深圳", "杭州")

sales <- c(85, 120, 70, 110, 95)

barplot(sales, 
        names.arg = cities,        # 设置条形的标签(城市名)
        main = "2024 年 5 月各城市销售额对比",  # 图表标题
        xlab = "城市",             # X 轴标签
        ylab = "销售额(万元)",   # Y 轴标签
        col = "skyblue",           # 条形填充颜色
        border = "darkblue")       # 条形边框颜色

代码注释说明:

  • sales 是数值向量,代表每个城市对应的销售额。
  • names.arg 指定条形图上每个条形对应的标签,这里填入城市名。
  • main 设置图表主标题,让读者一眼知道图表内容。
  • xlabylab 分别为 X 轴和 Y 轴添加说明。
  • col 控制条形的填充颜色,border 控制边框颜色。
  • 所有参数都以命名参数形式传入,避免顺序出错。

运行这段代码后,你会看到一个清晰的横向条形图(默认为垂直方向),每个条形的长度代表对应城市的销售额。


水平条形图 vs 垂直条形图:如何选择?

默认情况下,barplot() 绘制的是垂直条形图。但如果标签较长,比如城市名或产品名称太长,垂直排列会显得拥挤。这时,水平条形图就派上用场了。

我们通过 horiz = TRUE 参数来实现水平条形图:

barplot(sales, 
        names.arg = cities,
        main = "2024 年 5 月各城市销售额(水平条形图)",
        xlab = "销售额(万元)",
        ylab = "城市",
        col = "lightgreen",
        border = "darkgreen",
        horiz = TRUE)  # 关键参数:设置为水平方向

关键点说明:

  • horiz = TRUE 是切换方向的核心参数。
  • 当方向切换后,X 轴和 Y 轴的角色互换:X 轴变为数值轴,Y 轴变为类别轴。
  • 水平条形图在类别名称较长时更具可读性,适合展示 5 个以上类别的数据。

📌 小贴士:如果你的数据类别超过 10 个,建议优先考虑水平条形图,避免标签重叠或文字太小。


多组数据对比:堆叠与分组条形图

现实场景中,我们往往需要对比多个维度的数据。比如,你想比较 5 个城市在“上半年”和“下半年”的销售额。

我们准备两组数据:

sales_first_half <- c(40, 55, 35, 50, 45)
sales_second_half <- c(45, 65, 35, 60, 50)

sales_matrix <- rbind(sales_first_half, sales_second_half)

rownames(sales_matrix) <- c("上半年", "下半年")

barplot(sales_matrix,
        main = "2024 年各城市销售额分阶段对比(堆叠)",
        xlab = "城市",
        ylab = "销售额(万元)",
        col = c("orange", "lightcoral"),
        legend.text = TRUE,          # 显示图例
        args.legend = list(x = "topright"))  # 图例位置

代码注释:

  • rbind() 将两个向量按行合并为一个矩阵,每一行代表一个时间段。
  • col = c("orange", "lightcoral") 为不同时间段设置不同颜色。
  • legend.text = TRUE 启用图例,args.legend 控制图例位置。
  • 默认情况下,barplot 会将多行数据堆叠在一起,形成堆叠条形图。

如果你想让两个时间段的条形并排显示(分组条形图),只需添加 beside = TRUE 参数:

barplot(sales_matrix,
        main = "2024 年各城市销售额分阶段对比(分组)",
        xlab = "城市",
        ylab = "销售额(万元)",
        col = c("orange", "lightcoral"),
        legend.text = TRUE,
        args.legend = list(x = "topright"),
        beside = TRUE)  # 关键:设置为分组模式

对比理解:

  • 堆叠条形图:适合观察“总量”和“构成”(如:全年总销售额中,上半年和下半年各占多少)。
  • 分组条形图:适合直接比较“同时间段不同城市”的差异(如:北京在上半年和下半年的销售表现)。

高级定制:颜色、字体与布局优化

一个专业的条形图,不只是“能画出来”,更要“好看、易懂”。我们来优化一下之前的图表,提升视觉效果。

barplot(sales_matrix,
        main = "2024 年各城市销售额对比分析",
        xlab = "城市",
        ylab = "销售额(万元)",
        col = c("#FF6347", "#4682B4"),  # 使用十六进制颜色代码
        border = "gray50",
        legend.text = TRUE,
        args.legend = list(x = "topright", bty = "n"),  # bty = "n" 去除图例边框
        cex.names = 1.1,           # 调整标签字体大小
        cex.lab = 1.2,             # 调整轴标签字体大小
        cex.main = 1.3,            # 调整标题字体大小
        ylim = c(0, 150))          # 手动设置 Y 轴范围,避免自动缩放

参数详解:

  • cex.names 控制条形标签(城市名)的字体大小。
  • cex.lab 控制轴标签字体大小。
  • cex.main 控制主标题字体大小。
  • ylim = c(0, 150) 显式设定 Y 轴范围,确保所有数据都能完整显示,且不被自动缩放干扰。
  • bty = "n" 表示图例不加边框,使图表更简洁。

这些微调能让图表看起来更专业,也更符合实际汇报需求。


使用 ggplot2 绘制条形图:更现代的语法

虽然 barplot() 简单易用,但 ggplot2 提供了更强大、更灵活的语法体系。它遵循“图层化”思想,让你可以逐步构建图形。

首先安装并加载 ggplot2 包(如果尚未安装):


library(ggplot2)

接下来,我们将数据转换为数据框格式,这是 ggplot2 的标准输入:

df <- data.frame(
  city = rep(cities, each = 2),           # 每个城市重复两次(上半年、下半年)
  period = rep(c("上半年", "下半年"), times = 5),  # 两个时间段
  sales = c(sales_first_half, sales_second_half)  # 合并所有销售额
)

ggplot(df, aes(x = city, y = sales, fill = period)) +
  geom_col(position = "dodge", width = 0.6) +  # 分组条形图,width 控制条形宽度
  labs(title = "2024 年各城市销售额对比(ggplot2)",
       x = "城市",
       y = "销售额(万元)") +
  scale_fill_manual(values = c("上半年" = "#FF6347", "下半年" = "#4682B4")) +
  theme_minimal() +  # 使用简洁主题
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转 X 轴标签,避免重叠

代码注释:

  • aes(x = city, y = sales, fill = period) 定义图形映射:X 轴是城市,Y 轴是销售额,颜色由时间段决定。
  • geom_col()ggplot2 中绘制条形图的核心函数,position = "dodge" 实现分组。
  • scale_fill_manual() 自定义颜色,支持十六进制代码。
  • theme_minimal() 使用简洁风格,axis.text.x 调整标签角度,避免重叠。

ggplot2 的优势在于:逻辑清晰、可扩展性强、输出质量高。尤其适合复杂图表或需要批量生成的场景。


实际应用建议:如何选择绘图方式?

在实际工作中,我们该如何选择使用 barplot() 还是 ggplot2

场景 推荐方式 原因
快速查看单组数据 barplot() 语法简洁,无需额外包
多组数据对比(分组/堆叠) ggplot2 更灵活,支持图层叠加
需要打印或发表 ggplot2 图形质量高,支持导出为 PDF、SVG
自动化脚本生成图表 ggplot2 代码可复用,易于封装

简单来说:初学者从 barplot() 入门,进阶者拥抱 ggplot2


总结:掌握 R 绘图 – 条形图的关键

通过本文,我们系统学习了 R 语言中条形图的绘制方法。从基础的单组条形图,到多组对比的堆叠与分组图,再到使用 ggplot2 实现专业级可视化,每一步都为你打下坚实基础。

条形图虽然简单,却是数据沟通的桥梁。它把冰冷的数字,变成有温度的视觉语言。当你能熟练绘制条形图时,你就不再是“看数据的人”,而是“讲数据故事的人”。

无论你是数据分析新人,还是正在构建自动化报表系统,掌握 R 绘图 – 条形图,都是一次值得的投资。下一次当你面对一堆数据时,不妨先问自己一句:能不能用一条条形,说清楚它的故事?