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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

柱状图是在数据可视化过程中最为常见的图片形式之一,本文将借助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文件,设置图片长和宽

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值