ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

R 绘图 - 条形图:从基础到进阶实战

R 绘图 - 条形图:从基础到进阶实战

1. 引言

条形图(Bar Chart)是数据可视化中最常用的图表类型之一,用于展示分类变量的数值对比。在 R 语言中,条形图的绘制方式非常灵活,既可以使用基础绘图系统barplot(),也可以使用ggplot2包实现更丰富的定制。本文将从基础语法出发,逐步深入到分组条形图、堆叠条形图、水平条形图以及主题美化等实战技巧,帮助读者快速掌握 R 条形图的绘制方法。

2. 环境准备与数据构造

在开始绘图之前,先确认 R 环境已安装ggplot2包。若未安装,可执行以下命令进行安装:

install.packages("ggplot2")

本文示例将使用一个模拟的销售数据集,包含不同产品类别的季度销售额数据:

library(ggplot2) 构造示例数据:产品类别与销售额 sales_data <- data.frame( category = c("电子产品", "服装", "食品", "家居", "图书"), sales = c(320, 180, 260, 210, 150) ) 查看数据结构 print(sales_data)

3. 基础条形图:barplot() 函数

R 基础绘图系统中的barplot()函数是最简单的条形图绘制方式,适合快速查看数据分布。

3.1 简单垂直条形图

# 使用基础绘图系统绘制垂直条形图 barplot( height = sales_data$sales, names.arg = sales_data$category, main = "各产品类别销售额", xlab = "产品类别", ylab = "销售额(万元)", col = "steelblue", border = "white" )

上述代码中,height参数指定条形的高度(即数值向量),names.arg用于设置每个条形对应的类别标签,col控制条形填充颜色。

3.2 水平条形图

# 设置 horiz = TRUE 绘制水平条形图 barplot( height = sales_data$sales, names.arg = sales_data$category, main = "各产品类别销售额(水平)", xlab = "销售额(万元)", ylab = "产品类别", col = "tomato", border = "white", horiz = TRUE, las = 1 )

当类别名称较长时,水平条形图往往比垂直条形图更易阅读。las = 1用于确保坐标轴标签始终水平显示。

4. ggplot2 条形图:geom_bar() 与 geom_col()

ggplot2提供了更强大的绘图语法。绘制条形图时,geom_bar()默认对数据进行统计计数,而geom_col()直接使用数据中的数值作为条形高度。

4.1 使用 geom_col() 绘制数值条形图

# 使用 geom_col() 直接映射数值列 p1 <- ggplot(sales_data, aes(x = category, y = sales)) + geom_col(fill = "#4E79A7", width = 0.6) + labs( title = "各产品类别销售额", x = "产品类别", y = "销售额(万元)" ) + theme_minimal() print(p1)

4.2 使用 geom_bar() 绘制计数条形图

# 构造包含重复记录的样本数据 set.seed(42) survey_data <- data.frame( satisfaction = sample(c("满意", "一般", "不满意"), 100, replace = TRUE) ) geom_bar() 默认统计每个类别的频数 p2 <- ggplot(survey_data, aes(x = satisfaction)) + geom_bar(fill = "#F28E2B", width = 0.5) + labs( title = "满意度调查频数分布", x = "满意度", y = "人数" ) + theme_minimal() print(p2)

5. 分组条形图与堆叠条形图

当数据包含两个分类维度时,可以使用分组条形图或堆叠条形图进行对比。

5.1 构造多维度数据

# 扩展数据:增加季度维度 sales_quarter <- data.frame( category = rep(c("电子产品", "服装", "食品", "家居", "图书"), each = 4), quarter = rep(c("Q1", "Q2", "Q3", "Q4"), times = 5), sales = c( 80, 95, 70, 75, 45, 50, 40, 45, 60, 65, 70, 65, 50, 55, 48, 57, 35, 40, 38, 37 ) ) head(sales_quarter)

5.2 分组条形图

# 使用 position = "dodge" 实现分组条形图 p3 <- ggplot(sales_quarter, aes(x = category, y = sales, fill = quarter)) + geom_col(position = "dodge", width = 0.7) + labs( title = "各产品类别季度销售额对比", x = "产品类别", y = "销售额(万元)", fill = "季度" ) + theme_minimal() print(p3)

5.3 堆叠条形图

# 使用 position = "stack" 实现堆叠条形图 p4 <- ggplot(sales_quarter, aes(x = category, y = sales, fill = quarter)) + geom_col(position = "stack", width = 0.7) + labs( title = "各产品类别季度销售额堆叠图", x = "产品类别", y = "销售额(万元)", fill = "季度" ) + theme_minimal() print(p4)

6. 条形图美化与进阶技巧

6.1 添加数据标签

# 使用 geom_text() 在条形上方添加数值标签 p5 <- ggplot(sales_data, aes(x = category, y = sales)) + geom_col(fill = "#59A14F", width = 0.6) + geom_text(aes(label = sales), vjust = -0.5, size = 4) + labs( title = "各产品类别销售额(带标签)", x = "产品类别", y = "销售额(万元)" ) + ylim(0, 380) + theme_minimal() print(p5)

6.2 自定义颜色与主题

# 使用 scale_fill_manual() 自定义颜色,并调整主题 p6 <- ggplot(sales_quarter, aes(x = category, y = sales, fill = quarter)) + geom_col(position = "dodge", width = 0.7) + scale_fill_manual(values = c("#4E79A7", "#F28E2B", "#E15759", "#76B7B2")) + labs( title = "各产品类别季度销售额对比", x = "产品类别", y = "销售额(万元)", fill = "季度" ) + theme_bw() + theme( plot.title = element_text(hjust = 0.5, face = "bold", size = 16), axis.text.x = element_text(angle = 45, hjust = 1) ) print(p6)

6.3 使用 coord_flip() 实现水平条形图

# 通过 coord_flip() 将垂直条形图旋转为水平条形图 p7 <- ggplot(sales_data, aes(x = reorder(category, sales), y = sales)) + geom_col(fill = "#B07AA1", width = 0.6) + geom_text(aes(label = sales), hjust = -0.2, size = 4) + coord_flip() + labs( title = "各产品类别销售额(水平排序)", x = "产品类别", y = "销售额(万元)" ) + xlim(0, 380) + theme_minimal() print(p7)

这里使用reorder()函数按销售额对类别进行排序,使条形图呈现从高到低的排列,更便于比较。

7. 常见问题与注意事项

  • 数据格式:geom_col()要求y映射为数值列;若使用geom_bar()且未指定y,则默认统计频数。
  • 坐标轴截断:当数值差异较大时,不建议直接截断坐标轴,以免误导读者;可通过coord_cartesian(ylim = c(...))调整显示范围。
  • 中文显示:若图中中文标签出现乱码,需在 R 中设置中文字体,例如使用windowsFonts()或showtext包。
  • 颜色选择:建议使用色盲友好的配色方案,如RColorBrewer包中的Set2或Paired调色板。

8. 总结

本文系统介绍了 R 语言中条形图的绘制方法,涵盖基础绘图系统的barplot()函数和ggplot2包的geom_bar()/geom_col()两种主流方式,并进一步讲解了分组条形图、堆叠条形图、水平条形图以及数据标签、颜色主题等美化技巧。掌握这些内容后,读者可以根据实际业务场景灵活选择合适的条形图形式,快速完成高质量的数据可视化输出。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进