深入浅出:使用 R 语言构建专业的堆叠柱状图指南

在数据可视化的世界里,我们经常需要展示数据在不同维度下的构成与对比。你是否遇到过这样的情况:你不仅想看每个月的销售总额,还想直观地看到不同产品在每个月的销售额占比?或者,你需要对比不同班级的学生成绩分布,同时又要看到总人数的差异?

这就是堆叠柱状图大显身手的时候了。相比于标准的柱状图,堆叠柱状图允许我们在同一个图形中同时展示“整体”与“部分”的关系。在这篇文章中,我们将一起深入探讨如何使用 R 语言的基础绘图系统来创建、定制和优化堆叠柱状图。无论你是刚接触 R 语言的新手,还是希望巩固绘图技能的开发者,我相信你都能从这篇指南中获得实用的见解。

什么是堆叠柱状图?

堆叠柱状图是柱状图的一种变体,它主要用于展示两个分类变量之间的关系。想象一下,标准的柱状图就像是一根实心的柱子,代表一个总数;而堆叠柱状图则像是把不同颜色的积木一块接一块地叠在一起,形成一根完整的柱子。

  • 第一级分类(X轴): 通常代表时间、组别或类别。
  • 第二级分类(堆叠层): 代表每个大类中的子组成成分。

这种图表的核心优势在于,它既能让我们对比不同组别的总量(看柱子的总高度),又能让我们分析组别内部的结构比例(看各色块的高度)。

核心工具:barplot() 函数详解

在 R 语言中,我们不需要安装额外的第三方库(如 ggplot2)就可以创建漂亮的堆叠柱状图,R 的基础包中提供了一个非常强大的函数——barplot()

函数语法与核心参数

让我们先来看看这个函数的基本结构:

barplot(H, xlab, ylab, main, names.arg, col)

为了让你的图表更具专业性,我们需要深入理解几个关键参数的作用:

  • H(数据源):这是最重要的参数。

* 它通常是一个矩阵 或数据框。

关键技术点:* 如果你传入一个向量,R 会绘制简单的并列柱状图。只有当你传入一个矩阵时,barplot() 才会默认生成堆叠柱状图。矩阵的每一行通常代表一个堆叠组(如不同的月份),每一列代表一个子类别(如不同的产品)。

  • INLINECODEef33a8a4 和 INLINECODE07445f2c(轴标签):

* 分别定义 X 轴和 Y 轴的文本说明。这是图表可读性的基础,绝对不能省略。

  • main(主标题):

* 给整个图表加一个醒目的标题,让读者一眼就能明白图表的主题。

  • names.arg(柱子名称):

* 这是一个字符向量,用于定义 X 轴下方每个柱子的标签。如果不指定,R 会尝试使用矩阵的行名。

  • col(颜色):

* 用于定义堆叠块的颜色向量。颜色的选择直接影响图表的美观度。

  • legend.text(图例):

* 虽然在基础语法中常被省略,但在堆叠图中至关重要。它通常设置为列名,用于标识每种颜色代表的类别。

实战演练:从简单到复杂的构建过程

为了让你更好地掌握,我们将通过几个层层递进的例子来演示。我们将从最基础的数据录入开始,一步步优化图表。

示例 1:构建基础堆叠柱状图

首先,我们需要创建一个数据集。假设我们有几种产品(A, B, C, D…)在几个不同时间点的数据。

# 步骤 1: 创建数据
# 我们使用 read.table 直接在内存中创建一个数据框
# 这里模拟了 4 行数据(4 个时间点)和 7 列(7 个类别)
dat <- read.table(text = "A   B   C   D   E   F    G
1 10 80 30 90 70 60  90
2 20 50 70 50 40 10  40
3 60 80 80 60  60 30 160
4 20 40 70 80 20 10  70", header = TRUE)

# 步骤 2: 数据转换
# barplot 函数要画出堆叠图,需要输入矩阵。
# 这一步将数据框转换为矩阵是关键。
data_matrix <- as.matrix(dat)

# 步骤 3: 绘制图表
# 使用默认参数绘图
barplot(data_matrix)

代码解析:

当你运行这段代码时,你会发现 R 非常智能地完成了以下工作:

  • 它自动识别了矩阵的列,并将每一列的数据作为一个“色块”进行堆叠。
  • Y 轴的高度自动根据数据的总和进行了缩放。
  • X 轴的刻度标记了行号(1, 2, 3, 4)。

示例 2:美 化与自定义颜色

默认的图虽然画出来了,但通常不够美观。在我们的工作中,清晰的配色和标签是必不可少的。让我们来优化它。

# 重新定义一个更清晰的产品数据集
dat <- read.table(text ="ProdA ProdB ProdC ProdD
1 110 50 60 70 
2 120 50 80 65", header= TRUE)

# 绘制带颜色的堆叠图
# col 参数指定了两种颜色:金色和红色
barplot(as.matrix(dat), 
        col = c("gold3", "red"),
        main = "产品产量堆叠对比图",
        xlab = "批次",
        ylab = "产量")

实用见解:

在这个例子中,我们手动指定了 col = c("gold3", "red")。请注意,因为我们有两行数据,所以我们提供了两个颜色。如果你有 5 行数据,这里就需要提供 5 种颜色,否则 R 会循环使用颜色向量。

示例 3:添加图例与边界

一个完整的图表绝对不能缺少图例。对于堆叠图来说,图例就是解码颜色的钥匙。此外,我们还可以通过调整边框让图表更清晰。

# 准备数据:不同季度的销售数据
sales_data <- read.table(text = "Q1 Q2 Q3 Q4
ProductA 25 30 40 35
ProductB 15 20 25 30
ProductC 10 15 10 20", header = TRUE)

# 转换为矩阵
sales_matrix <- as.matrix(sales_data)

# 绘制图表
barplot(height = sales_matrix,
        main = "2023年各季度产品销售分布",
        xlab = "季度",
        ylab = "销售额 (万元)",
        col = c("#2E8B57", "#4682B4", "#FF7F50"), # 使用十六进制颜色码更专业
        border = "white", # 给每个色块加白色边框,增加层次感
        legend.text = rownames(sales_matrix), # 添加图例
        args.legend = list(x = "topright", bty = "n") # 将图例放在右上角,无边框
)

关键改进点:

  • border = "white": 这是一个小技巧,给每个堆叠块加上细白边,可以使不同颜色的块之间分界更清晰,尤其是在打印或灰度显示时效果更好。
  • legend.text: 直接关联数据的行名,这样我们不需要手动输入图例文字。
  • args.legend: 传递一个列表给图例参数,用于精确控制图例的位置和样式,避免它遮挡住数据柱。

进阶应用:不仅限于堆叠

你可能会问,如果我想横向对比数据,而不是堆叠起来,该怎么办?其实只需要一个参数的改动。

示例 4:并列柱状图

有时候,堆叠会掩盖底部数据的数值大小,这时候“分组并列”是更好的选择。

# 使用之前的 sales_data
# 添加 beside = TRUE 参数,即“并排”显示
barplot(height = sales_matrix,
        main = "各季度产品销售对比 (并列模式)",
        xlab = "季度",
        ylab = "销售额",
        col = c("#2E8B57", "#4682B4", "#FF7F50"),
        beside = TRUE, # 关键代码:将堆叠改为并列
        legend.text = rownames(sales_matrix),
        args.legend = list(x = "topright")
)

这个 beside = TRUE 参数非常强大,它让你能在同一个函数中切换两种完全不同的视图模式。

常见错误与最佳实践

在我们实际的教学和开发过程中,观察到很多初学者在创建堆叠柱状图时会遇到一些共性问题。让我们来看看如何避免这些“坑”。

1. 数据维度不匹配

错误场景: 你有一个包含 100 行数据的时间序列,直接传给了 barplot()
结果: 图表变得密密麻麻,根本无法阅读。
解决方案: 堆叠柱状图并不适合展示过多的分类。如果你的数据行数超过 20 个,建议先对数据进行聚合(例如按月聚合,而不是按天),或者考虑使用折线图。

2. 数据类型的陷阱

错误场景: 传入的 H 是一个数据框,但其中有一列是非数值型(比如产品名称列)。
结果: 报错或绘图异常。
解决方案: 确保 INLINECODEa163b4b0 接收到的矩阵是纯数值的。如果数据框包含 ID 列,先将其剔除。可以使用 INLINECODE75113748 或者 as.matrix(dat[, -1]) 来仅选择数值列。

3. 颜色设置不当

错误场景: 使用了过于鲜艳或过于接近的颜色(如红色和绿色一起使用)。
结果: 图表刺眼,或者色弱人群无法区分。
解决方案: 使用专业的配色方案。推荐使用 RColorBrewer 包中的调色板,或者使用上述示例中的柔和色系。

示例 5:结合 RColorBrewer 的专业绘图

让我们看看如何用更现代的方式调用颜色,这也是我们在实际项目中推荐的做法。

# 假设我们要加载这个包(如果未安装请先安装)
# install.packages("RColorBrewer")
library(RColorBrewer)

# 准备数据
regions <- read.table(text = "North South East West
2020 100 150 120 130
2021 110 160 125 140
2022 120 170 130 150", header = TRUE)

# 选择一个配色方案,例如 "Set2"
my_colors <- brewer.pal(nrow(regions), "Set2")

# 绘图
barplot(as.matrix(regions),
        col = my_colors,
        main = "区域销售额年度对比",
        legend.text = rownames(regions),
        args.legend = list(title = "Year", x = "topright"))

结语与下一步建议

通过这篇指南,我们已经从零开始,掌握了使用 R 语言基础函数 barplot() 创建堆叠柱状图的全过程。我们不仅学会了语法,还探讨了如何通过颜色、边框和图例来提升图表的专业度,以及如何避免常见的数据错误。

核心要点总结:

  • 使用矩阵作为 barplot() 的输入是生成堆叠图的关键。
  • 始终为你的图表添加轴标签图例
  • 利用 border 参数增强视觉分隔。
  • 当类别过多时,考虑数据聚合或切换图表类型。

下一步建议:

我建议你尝试使用自己的数据集来运行上述代码。你可以尝试调整 INLINECODE3828cc99 参数中的颜色代码,或者修改 INLINECODEae54a872 标题,看看图表会有什么变化。当你对基础绘图感到满意后,可以进一步探索 INLINECODEac378c6b 包,它提供了基于语法的图层化绘图系统,能实现更复杂的定制。但在那之前,掌握 INLINECODE80b18732 将是你理解 R 语言图形系统的坚实基石。

希望这篇指南能帮助你在数据分析的道路上走得更远!如果你在实践过程中有任何问题,欢迎随时查阅 R 的官方文档或社区支持。祝你绘图愉快!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/39646.html
点赞
0.00 平均评分 (0% 分数) - 0