ggplot2绘制堆积柱状图

R语言用ggplot2绘制堆积柱状图遇到的问题(y轴顺序、facet_wrap分面顺序)- 需要将名称因子化

1、用ggplot2绘制菌的堆积柱状图时,y轴的顺序是按照菌属的首字母排序的,而不是按照我表格中顺序,代码如下(以门水平的数据示例):

image

这里,我们先将原始数据处理,筛选出排名前4的门,其它的用Others代替。

#import data and modify it
phylum <- read.table('phylumAbundance.txt', sep="\t", header=T, row.names=1)
phylum.ave <- apply(phylum, 1, FUN=mean)
phylum.2 <- cbind(phylum, phylum.ave)[order(-phylum.ave),]

#sum(phylum.2$phylum.ave[1:4])  #check the summary of top 4 taxonomies
phylum.2 <- subset(phylum.2[1:4,], select=-phylum.ave)
phylum.2 <- rbind(phylum.2, others=apply(phylum.2, 2, function(x){100-sum(x)}))

#apply(phylum.2, 2, function(x){sum(x)})  #check the summary of each column
phylum.2 <- cbind(PhylumID=row.names(phylum.2), phylum.2)

#convert the data format
library(reshape2)
phylum.gg <- melt(phylum.2, id.vars="PhylumID", variable.name="SampleID", value.name="Abundance")

#sum(phypum.gg$Abundance) #check
#plot bar chart
library(ggplot2)
ggplot(phylum.gg, aes(SampleID, Abundance, fill=PhylumID)) +
  geom_bar(stat="identity") +
  guides(fill=guide_legend(reverse=F)) +
  scale_y_continuous(expand=c(0,0))

得到的图如下

image

经过查找资料后发现,需要将菌的名称因子化(factor),于是在将数据框由“宽”变“长”前,先将菌的名称因子化:(tips:不可在转为长数据后再因子化,这样会报错:显示名称有重复。)

phylum.2$PhylumID <- factor(phylum.2$PhylumID, levels = rev(phylum.2$PhylumID))

重新绘图得到正确的图:

image

2、为了让图片更美观,将上述数据分成三组“M,L,C”,用“facet_wrap”绘制分面图。一开始,我没有将组别名称因子化,得到的分面结果是按照“C,L,M”排序的。

在绘图前加入分组信息:

phylum.gg$group <- c(rep('M', 30), rep('L', 40), rep('C', 40))

ggplot(phylum.gg, aes(SampleID, Abundance, fill = PhylumID)) +
  geom_col(position = 'stack', width = 0.6) +
  facet_wrap(~group, scales = 'free_x', ncol = 3) +
  scale_fill_manual(values =  rev(c('blue', 'orange', 'green', 'yellow', 'gray'))) +
  labs(x = '', y = 'Relative Abundance(%)') +
  theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 13), legend.text = element_text(size = 11, face='italic'))
image

最开始我没搞明白为什么会这样,但我发现了是按字母排序的。

方法1(可行):于是我将组别名称改为“A,B,C”,再修改组别名称,从而得到想要的结果。

参考方法:https://ggplot2.tidyverse.org/reference/as_labeller.html

image
image

方法2(不可行):后面我知道需要将组别名称因子化才行,于是想将组别名称先做到一张表里,因子化后再与数据合并。

image
groupData <- read.delim('group.txt', sep = '\t', stringsAsFactors = FALSE)
groupData$group <- factor(groupData$group, levels = rev(groupData$group))

这时会报错:

image
Error in `levels<-`(`*tmp*`, value = as.character(levels)) : 
  factor level [2] is duplicated

和处理y轴菌的名称时一样,会提示有重复。

这样做是参考了http://www.360doc.com/content/17/0912/21/46931810_686600613.shtml,但这个里面和我的数据不太一样。

image

其它:在查找过程中看到的别人绘制堆积柱状图的代码,数据处理过程要比我的简单,供参考。

来源:http://blog.sciencenet.cn/blog-3406804-1166733.html

####读取并挑选 top4丰度门

#读取数据
phylum <- read.table('phylumAbundance.txt', row.names = 1, sep = '\t', header=T)

#求各类群的丰度总和,并排序
phylum$sum <- rowSums(phylum)
phylum <- phylum[order(phylum$sum, decreasing = TRUE), ]

#挑选 top4门类群,并将 top4外的类群合并为“Others”
phylum_top4 <- phylum[1:4, -ncol(phylum)]
phylum_top4['Others', ] <- 100 - colSums(phylum_top4)

#可选输出(如 csv 格式)
#write.table(phylum_top4, 'phylum_top4.txt', sep="\t", quote = FALSE)

####ggplot2 作图(一个简单示例)
library(reshape2) #用于排列数据
library(ggplot2) #ggplot2 作图

#调整数据布局
phylum_top4$Phylum <- factor(rownames(phylum_top4), levels = rev(rownames(phylum_top4)))
phylum_top4 <- melt(phylum_top4, id = 'Phylum')

#添加分组
groupData <- read.delim('group.txt', sep = '\t', stringsAsFactors = FALSE)
names(groupData)[1] <- 'variable'
phylum_top4 <- merge(phylum_top4, groupData, by = 'variable', sort=F)

#绘制带分面的柱状图
real_group <- as_labeller(c(`A`="Model", `B`="LHE", `Control`="Control"))

p <- ggplot(phylum_top4, aes(variable, value, fill = Phylum)) +
  geom_col(position = 'stack', width = 0.6) +
  facet_wrap(~group, scales = 'free_x', ncol = 3, labeller=real_group) +
  scale_fill_manual(values =  rev(c('blue', 'orange', 'green', 'yellow', 'gray'))) +
  labs(x = '', y = 'Relative Abundance(%)') +
  theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), strip.text = element_text(size = 12)) +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 13), legend.text = element_text(size = 11, face='italic'))

p

ggsave('ggplot2_plot.png', p, width = 8, height = 6)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350