news 2026/10/21 11:30:37

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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()两种主流方式,并进一步讲解了分组条形图、堆叠条形图、水平条形图以及数据标签、颜色主题等美化技巧。掌握这些内容后,读者可以根据实际业务场景灵活选择合适的条形图形式,快速完成高质量的数据可视化输出。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 11:26:30

foobox 安装教程:5 分钟给 foobar2000 装上现代皮肤

foobox 安装教程&#xff1a;5 分钟给 foobar2000 装上现代皮肤 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你用了几年 foobar2000&#xff0c;界面还停在灰底单列表&#xff1f;foobox 是一套装…

作者头像 李华
网站建设 2026/10/21 11:24:53

【C++】进阶篇 STL map和set使用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 11:23:06

KafkaProducer 分区策略:一条消息怎么被分到正确的 Partition

为什么分区策略很重要 前面几篇一直在讲"消息进了 RecordAccumulator 之后怎么发"。但有个问题没回答&#xff1a;同一条消息&#xff0c;为什么会被塞进 topic-A 的 P0 而不是 P1&#xff1f; 这个决定发生在 partitioner.partition() 这一步。它看起来简单——返回…

作者头像 李华
网站建设 2026/10/21 11:20:51

Unity游戏上架微信小游戏:适配全程与避坑实录

Unity游戏上架微信小游戏&#xff1a;适配全程与避坑实录 【免费下载链接】minigame-unity-webgl-transform 微信小游戏Unity引擎适配器文档。 项目地址: https://gitcode.com/GitHub_Trending/mi/minigame-unity-webgl-transform 把一个跑在手游端的 Unity 项目搬进微信…

作者头像 李华
网站建设 2026/10/21 11:16:14

Jasna 马赛克检测模型怎么选?7 个选项一篇看懂

Jasna 马赛克检测模型怎么选&#xff1f;7 个选项一篇看懂 【免费下载链接】jasna Video restoration tool 项目地址: https://gitcode.com/GitHub_Trending/ja/jasna Jasna 是一款开源的 JAV 视频马赛克修复工具&#xff1a;先由检测模型逐帧找出被遮挡区域&#xff0c…

作者头像 李华