R语言绘制柱状图(bar plot)

本文介绍了如何使用R语言的ggplot2包中的geom_bar()函数绘制柱状图,包括identity、fill、dodge等参数的用法,并通过案例展示了不同position参数下的柱状图效果,如堆积柱状图、百分比堆积柱状图和分组柱状图。还提到了使用facet_grid()函数进行数据分块和coord_flip()函数实现横轴柱状图。

柱状图是在数据可视化过程中最为常见的图片形式之一,本文将借助R语言中的ggplot2这个包绘制常用的柱状图。在ggplot2包中主要是使用geom_bar()这个函数来绘制柱状图。该函数主要包括以下5个参数,我们可以通过输入?geom_bar命令来查看帮助文档。
在这里插入图片描述
stat:有identity、count和bin这三个参数。其中identity比较常用,表示直接引用数据集中的变量的值(默认为count)。

position:我的理解为调整柱状图的形式,有identity、fill、dodge这三种形式,下面将通过案例1对此进行详细讲解。

width:调整柱子的宽度。

color:调整柱子边框的颜色。

fill:调整柱子的填充颜色。

案例一:在这里插入代码片

使用ggplot2包里的“diamonds”数据集。diamonds数据集包含大约 54 000 颗钻石的信息,每颗钻石具有 price、carat、color、clarity 和 cut 变量。案例一将使用cut(切割质量)和clarity (钻石的纯净度)这两个变量。
1、调整参数position=“identity”,color = “white”

library(tidyverse) # 载入数据集和绘图包
ggplot(data = diamonds) +
  geom_bar(aes(x = cut, fill = clarity), 
           color = "white", position = "identity")

在这里插入图片描述
可以观察到当position=“identity”该图的形式为高度表示绝对数量的堆积柱状图,当color = “white”时边框变成了白色,当我们想改变柱子的填充颜色时,可以使用fill这个函数。
同时,我们也可以通过coord_flip()函数把柱子变成横向的。

coord_flip()

在这里插入图片描述
如果我们想通过clarify的不同把该图分为不同小块,可以通过facet_grid()函数来实现。


ggplot(data = diamonds) +
  geom_bar(aes(x = cut, fill = clarity), color = "white", position = "identity")+
  facet_grid(.~clarity)

在这里插入图片描述


ggplot(data = diamonds) +
  geom_bar(aes(x = cut, fill = clarity), color = "white", position = "identity")+
  facet_grid(clarity~cut)

从以上代码可以看出,facet_grid()2个变量间用“~”进行分隔,当只需要使用1个变量时,另一个变量使用“.”代替。当然,这个数据分块后的结果并不好看,在此只是借助该数据展示facet_grid()函数的用法与可实现的效果。

在这里插入图片描述

ggplot(data = diamonds) +  geom_bar(aes(x = cut, fill = clarity), position = "fill")

在这里插入图片描述
当position=“fill”时该图的形式为高度表示相对数量的百分比堆积柱状图,每个柱子的最大高度均为1。


ggplot(data = diamonds) +
  geom_bar(aes(x = cut, fill = clarity), position = "dodge")

当position=“dodge”时该图的形式为柱子高度表示绝对数量的分组柱状图。

案例二:

下面将通过案例二来绘制分组堆叠柱状图.

library(ggplot2)   # 用于绘图
library(ggalluvial) # 用于绘制柱状图背后的条带
ra <- as.matrix(read.table("abundance.txt", row.names =1, 
                           header = F, sep = "\t")) # 读入相对丰度数据并转换为矩阵方便后续数据整理

在这里插入图片描述
Note: 从左至右分组分别为JRZS0,JRZS2,NRZS0,NRZS2,XRZS0,XRZS2共6个分组。其中JR、NR、XR分别为3种不同品种的水稻:粳稻、糯稻、籼稻;ZS0和ZS2分别代表不施用基肥和施用2kg/亩的锌肥。


group <- c("JR", "NR","XR")  # 水稻品种变量
code <- c("JRZS0","JRZS2","NRZS0","NRZS2","XRZS0","XRZS2") # 6组处理变量
dat <- data.frame(code = rep(code,each = 7),
                  taxa = rep(rownames(ra), 6),
                  cultivar = rep(group, each = 14),
                  abundance = as.vector(ra)) # 按照ggplot绘图所需格式进行数据整理
dat$taxa <- factor(dat$taxa, levels = c("Actinobacteriota","Chloroflexi","Proteobacteria",
                                        "Acidobacteriota","Myxococcota","Desulfobacterota","Others"))
                                        #这个用于对各菌门数据进行排序
head(dat) # 查看整理好的数据前6行
 code             taxa cultivar  abundance
1 JRZS0 Actinobacteriota       JR 0.22722374
2 JRZS0      Chloroflexi       JR 0.22339743
3 JRZS0   Proteobacteria       JR 0.20567651
4 JRZS0  Acidobacteriota       JR 0.09652968
5 JRZS0      Myxococcota       JR 0.03646502
6 JRZS0 Desulfobacterota       JR 0.05270264

ggplot(dat, aes(x = code, y = abundance, fill = taxa))+
  geom_bar(stat = "identity", width = 0.7)+ # 柱状图绘制
  geom_flow(aes(alluvium = taxa), alpha = 0.5) + # 添加柱状图后的条带
  scale_fill_manual(values = c("#0068ad", "#8ac2df","#f8d9c5",
                               "#eca282","#c80321","#c9b1d5","#fcdaeb"))+
  theme_bw()+ # 将主题调整为白色背景和浅灰色网格线
  facet_grid(.~cultivar, scales = "free_x", space = "free_x")+ # 按照cultivar这个变量进行分块
  xlab("")+ # 去掉x轴的标题
  ylab("Relative abundance (%)")+ # 设置y轴的标签
  theme(panel.grid.major.x = element_blank(),
        axis.text.x = element_text(size = rel(1.2), angle = (-30)),
        axis.text.y = element_text(size=rel(1.2)),
        legend.text = element_text(size = rel(1))) # 更改x轴、y轴的字体大小、刻度线等
ggsave("Abundance.pdf", width = 6, height = 4) # 图片导出,导出为pdf文件,设置图片长和宽

在这里插入图片描述

<think>首先,用户的问题是:“我想查找使用R语言绘制多组柱状图bar plot)的方法”。用户提供了几个引用,我需要参考这些内容来回答。 关键引用: - 引用[1]:使用barplot函数可视化相对频率柱状图,包括代码示例:`barplot(prop.table(my_table) * 100, ...)`。 - 引用[2]:使用ggplot2包绘制柱状图,包括数据准备和代码示例用ggplot2。 - 引用[3]:使用ggplot2的geom_bar()函数绘制柱状图,提到了参数如stat。 用户指定要绘制多组柱状图bar plot),意思是多个组别的柱状图,可能在同一个图中比较不同组的数值。 在我的回答中,我需要遵循系统级指令: - 使用$...$格式行内数学表达式(如果适用)。 - 独立公式用$$...$$。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 回答结构: 1. **介绍多组柱状图**:解释什么是多组柱状图,以及在ggplot2或基础R中如何实现。 2. **方法一:使用基础R(barplot函数)**:基于引用[1],展示如何绘制分组柱状图。 3. **方法二:使用ggplot2**:基于引用[2]和[3],展示ggplot2方法,更推荐因为更灵活和美观。 4. **代码示例**:提供具体代码片段,参考给出的引用。 5. **添加误差条(可选)**:用户提到误差条在引用[1]和[2],所以可以包括。 6. **总结**:建议最佳实践。 7. **生成相关问题**:在末尾添加相关问题。 内容基于引用: - 引用[1]:使用barplot函数。 - 引用[2]:使用ggplot2,有数据和代码示例。 - 引用[3]:geom_bar的使用。 绘制多组柱状图的关键: - **在基础R**:使用barplot函数,传入矩阵数据,设置beside=TRUE来分组显示。 - **在ggplot2**:使用geom_bar或geom_col,结合group和fill美学变量来分组。 在引用[2]中已经有了一个完整的ggplot2例子,数据框中有group和number变量,可以用来绘制柱状图。引用[2]的数据是: - group: categorical groups - number: values - sd: standard deviation for error bars 所以,我可以基于这个提供ggplot2代码。 步骤: 1. 准备数据:类似于引用[2]的数据结构。 2. 使用ggplot2:geom_col for bar plots (since we have height values), or geom_bar for counts. 3. 添加误差条:使用geom_errorbar. 在引用[3]提到geom_bar有stat参数,通常用identity表示直接用数值。 回答计划: - 先介绍概念。 - 然后提供两种方法。 - 给出代码。 - 最后相关问题。 确保中文回答。 </think>### R语言绘制多组柱状图Bar Plot)的方法 在R语言中,绘制多组柱状图(multiple group bar plot)是数据可视化的常见需求,用于比较多个类别在不同组别下的数值差异。多组柱状图通常将每组数据以并排柱状显示,便于直观对比。下面我将基于您提供的参考引用,逐步解释两种主要方法:使用基础R的`barplot`函数和使用`ggplot2`包。`ggplot2`方法更灵活且美观,推荐优先使用[^3]。所有代码示例均兼容R 4.0+版本。 --- #### 方法一:使用基础R的`barplot`函数(适用于简单场景) 基础R的`barplot`函数可以直接绘制多组柱状图,但需将数据组织为一个矩阵,其中列表示组别,行表示类别。参数`beside=TRUE`确保柱状图并排显示。 **步骤:** 1. 准备数据:数据必须是矩阵格式,每列代表一个组别。 2. 调用`barplot`函数:设置`beside=TRUE`分组显示。 3. 添加误差条(可选):使用`arrows`函数添加误差条,基于标准差或置信区间。 **代码示例:** ```r # 创建示例数据:3个类别(A、B、C)在2个组别(Group1、Group2)下的值 data_matrix <- matrix(c( 10, 15, # Group1: 类别A=10, 类别B=15 8, 12 # Group2: 类别A=8, 类别B=12 ), ncol=2, byrow=TRUE) colnames(data_matrix) <- c("Group1", "Group2") # 组别名 rownames(data_matrix) <- c("Category A", "Category B") # 类别名 # 绘制多组柱状图 barplot(data_matrix, beside=TRUE, main="多组柱状图示例 (基础R)", xlab="类别", ylab="值", col=rainbow(2), ylim=c(0,20)) legend("topright", legend=colnames(data_matrix), fill=rainbow(2)) # 添加图例 # 添加误差条(假设标准差为2) sd_values <- matrix(c(1.5, 2.0, 1.2, 1.8), ncol=2, byrow=TRUE) # 误差值矩阵 bar_positions <- barplot(data_matrix, beside=TRUE, plot=FALSE) # 获取柱状位置 arrows(bar_positions, data_matrix - sd_values, bar_positions, data_matrix + sd_values, angle=90, code=3, length=0.1) # 绘制误差条 ``` - **关键点**: - `beside=TRUE`实现并排分组显示。 - `arrows`函数添加误差条,误差值需与数据矩阵维度匹配。 - 此方法简单但自定义性较弱,适用于快速绘图[^1]。 --- #### 方法二:使用`ggplot2`包(推荐,可视化效果更好) `ggplot2`是R中最强大的绘图包,适合创建复杂多组柱状图。数据需组织为长格式数据框(long format),使用`geom_col`或`geom_bar`绘制柱状图,并通过`position_dodge`实现分组。`geom_errorbar`添加误差条。 **步骤:** 1. 准备数据:创建数据框,包含类别列、组别列、值列和误差列。 2. 绘制基础柱状图:使用`geom_col`(值直接映射)或`geom_bar`(计数值)。 3. 分组显示:设置`position=position_dodge()`确保并排。 4. 添加误差条:使用`geom_errorbar`,指定误差范围。 **代码示例(基于引用[2]的数据结构):** ```r # 加载包 library(ggplot2) library(ggpubr) # 用于美化主题 # 创建示例数据(类似引用[2]) data <- data.frame( group = factor(rep(c("Group1", "Group2"), each=3)), # 组别 category = factor(rep(c("A", "B", "C"), times=2)), # 类别 value = c(10, 15, 12, 8, 12, 10), # 值 sd = c(1.5, 2.0, 1.8, 1.2, 1.5, 1.0) # 标准差 ) # 绘制多组柱状图 ggplot(data, aes(x=category, y=value, fill=group)) + geom_col(position=position_dodge(width=0.8), width=0.7) + # position_dodge实现并排 geom_errorbar( aes(ymin=value - sd, ymax=value + sd), # 误差条范围 width=0.2, position=position_dodge(width=0.8) # 与柱状对齐 ) + labs(title="多组柱状图示例 (ggplot2)", x="类别", y="值", fill="组别") + theme_minimal() + # 简洁主题 scale_fill_brewer(palette="Set1") # 颜色方案 # 保存图片(可选) ggsave("bar_plot.png", device="png", dpi=300) ``` - **关键点**: - `position=position_dodge(width=0.8)`是关键参数,控制分组间距。 - `geom_col`用于值直接映射(stat="identity"),而`geom_bar(stat="identity")`效果相同。 - 误差条通过`ymin`和`ymax`动态计算范围,确保精度[^2][^3]。 - **优势**:`ggplot2`支持高自定义(如颜色、标签、主题),易于扩展为复杂图表。 --- #### 建议与注意事项 - **数据格式优先**:确保数据为长格式(每行一个观察值),便于ggplot2处理。 - **误差条实践**:误差条适用于展示标准差或置信区间,提升图表可靠性[^1]。 - **性能优化**:大数据集时,使用`data.table`处理数据以提升速度。 - **工具选择**:简单图用基础R,复杂或多图层图用`ggplot2`。`ggplot2`的`geom_bar`默认用于频率图,若需自定义值,请用`geom_col`或`stat="identity"`[^3]。 通过以上方法,您可高效绘制多组柱状图。如果遇到特定数据结构或错误,请提供示例数据,我会进一步优化方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值