R 绘图 – 条形图(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

在数据分析领域,R 语言凭借其强大的可视化能力,成为科研工作者和开发者的首选工具之一。条形图(Bar Chart)作为数据可视化的基础图表类型,能够直观展示分类变量的分布或比较不同组别的数值差异。无论是统计销售额、分析用户行为,还是呈现实验结果,条形图都能以简洁的方式传递关键信息。本文将从基础语法到高级技巧,系统讲解如何在 R 中高效绘制条形图,帮助读者掌握这一实用技能。

基础概念:什么是条形图?

条形图通过不同长度的矩形条来展示分类数据的数值对比。与柱状图(Histogram)不同,条形图适用于离散分类变量,而柱状图用于连续数值型变量。例如,比较不同国家的 GDP 总量(分类变量为国家名称,数值为 GDP 值)时,条形图是更合适的选择。

想象条形图就像“数据的身高尺”——每个分类就像一个“人”,条的长度代表他们的“身高”(数值大小)。通过排列这些“身高尺”,读者可以一目了然地看出谁更高(数值更大)。

基础语法:两种主流方法

在 R 中,绘制条形图主要有两种方法:基础绘图系统(Base R)和 ggplot2 包。

1. Base R 方法

基础 R 的 barplot() 函数是快速入门的工具。以下是一个简单示例:

categories <- c("A", "B", "C", "D")  
values <- c(23, 45, 18, 37)  

barplot(height = values,  
        names.arg = categories,  
        main = "基础条形图示例",  
        xlab = "分类",  
        ylab = "数值",  
        col = "skyblue")  

参数解析

  • height: 必须参数,指定条的数值高度。
  • names.arg: 设置 x 轴的分类标签。
  • main, xlab, ylab: 分别设置标题和坐标轴标签。
  • col: 调整条的颜色。

2. ggplot2 方法

ggplot2 是基于“语义化绘图”理念的包,通过分层构建图表,适合复杂需求。安装并加载包后,代码如下:

install.packages("ggplot2")  
library(ggplot2)  

data <- data.frame(  
  Category = c("A", "B", "C", "D"),  
  Value = c(23, 45, 18, 37)  
)  

ggplot(data, aes(x = Category, y = Value)) +  
  geom_bar(stat = "identity", fill = "lightgreen") +  
  ggtitle("ggplot2 条形图示例") +  
  xlab("分类") +  
  ylab("数值")  

核心函数解析

  • ggplot(): 初始化绘图,指定数据源和坐标轴映射(aes())。
  • geom_bar(): 定义图表类型为条形图,stat = "identity" 表示直接使用数据中的数值。
  • fill: 设置条的颜色。

深入调整:参数与样式优化

1. 颜色与填充

颜色能显著提升图表的可读性和美观度。例如,使用 scale_fill_brewer() 可以快速应用专业配色:

ggplot(data, aes(x = Category, y = Value)) +  
  geom_bar(stat = "identity", fill = "steelblue") +  
  scale_fill_brewer(palette = "Set1")  

2. 标签与文本调整

添加数值标签能让图表更直观。通过 geom_text() 可以实现:

ggplot(data, aes(x = Category, y = Value)) +  
  geom_bar(stat = "identity", fill = "orange") +  
  geom_text(aes(label = Value), vjust = -0.5)  # vjust 控制文本垂直位置  

3. 排序与分组

如果分类变量的数值需要按大小排序,可以使用 dplyr 包进行数据预处理:

library(dplyr)  

sorted_data <- data %>%  
  arrange(desc(Value))  # 按数值降序排列  

ggplot(sorted_data, aes(x = Category, y = Value)) +  
  geom_bar(stat = "identity")  

4. 图表尺寸与坐标轴

调整坐标轴范围或旋转标签可避免重叠:

ggplot(data, aes(x = Category, y = Value)) +  
  geom_bar(stat = "identity") +  
  coord_cartesian(ylim = c(0, 50)) +  # 固定 y 轴范围  
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转 x 轴标签  

高级技巧:复杂场景应对

1. 分组条形图(Grouped Bar Chart)

当需要比较多个子组时,分组条形图能清晰展示差异。例如,比较不同地区(A/B)在不同季度的销售额:

group_data <- data.frame(  
  Quarter = rep(c("Q1", "Q2", "Q3", "Q4"), 2),  
  Region = rep(c("A", "B"), each = 4),  
  Sales = c(120, 150, 180, 200, 100, 140, 160, 190)  
)  

ggplot(group_data, aes(x = Quarter, y = Sales, fill = Region)) +  
  geom_bar(stat = "identity", position = "dodge") +  
  labs(title = "分组条形图:地区销售额对比", fill = "区域")  

2. 堆叠条形图(Stacked Bar Chart)

堆叠条形图适合展示各子组的占比:

ggplot(group_data, aes(x = Quarter, y = Sales, fill = Region)) +  
  geom_bar(stat = "identity", position = "stack")  

3. 响应式布局与交互

对于长格式数据,使用 facet_wrap() 可以按分类分面绘制:

ggplot(group_data, aes(x = Quarter, y = Sales, fill = Region)) +  
  geom_bar(stat = "identity", position = "dodge") +  
  facet_wrap(~ Region)  

实际案例:分析电影评分数据

以下通过真实数据(假设数据集 movies 包含 GenreRating 字段)演示完整流程:

movies <- read.csv("movies.csv")  

avg_ratings <- movies %>%  
  group_by(Genre) %>%  
  summarise(Average_Rating = mean(Rating))  

ggplot(avg_ratings, aes(x = Genre, y = Average_Rating)) +  
  geom_col(fill = "dodgerblue", color = "white", size = 0.5) +  
  labs(  
    title = "各类型电影平均评分对比",  
    x = "电影类型",  
    y = "平均评分",  
    caption = "数据来源:假设数据集"  
  ) +  
  theme_minimal() +  
  theme(axis.text.x = element_text(angle = 45, hjust = 1))  

输出效果说明

  • geom_col()geom_bar(stat = "identity") 的简写,语法更简洁。
  • theme_minimal() 应用简约主题,caption 添加数据说明。

结论

掌握 R 绘图中的条形图技巧,不仅能提升数据分析的效率,更能通过可视化结果清晰传达信息。从基础语法到高级定制,R 提供了灵活且强大的工具链。建议读者通过实际数据练习,逐步探索更多参数和包(如 plotly 生成交互图表)。记住,优秀的图表是“无声的讲解者”——它需要精准的数据支撑,也需要艺术化的表达技巧。

关键词布局回顾

  • 标题直接包含“R 绘图 – 条形图”
  • 正文通过“条形图”“R 语言”等自然嵌入核心概念
  • 结尾总结呼应主题,强化关键词的记忆点

通过本文的学习,读者应能从零开始构建专业级条形图,并为后续学习其他图表类型(如折线图、散点图)奠定基础。实践是最好的老师,不妨立即尝试用你的数据开始创作吧!

最新发布