首页 文章

使用颜色列在R中复杂的堆积条形图

提问于
浏览
1

我正在尝试使用R制作堆叠的条形图 . 主要的关键点是使用图中颜色列的颜色 .

情节要求:

  • 每个条形(x轴)应代表一个时间 .

  • 每个物种应该是适当的颜色(由颜色栏给出),其在条形图上的空间反映丰度(y轴) .

  • 在每个酒吧内,同一门的物种应该组合在一起 .

  • 设置条的宽度真的很酷,但不是必需的 .

数据集的特征:

  • 每个物种都有一种单独的颜色,物种的颜色由它们的门进行渐变 .

  • 一段时间内物种的丰度总和为100 .

  • 并非每个物种都在每一次

  • 有7次,8门,132种

关于如何表示这些数据的其他想法是受欢迎的 .

代表数据:

phyla           species                         abundance    color    time
Actinobacteria  Bifidobacterium_adolescentis    18.73529    #F7FBFF   D30
Firmicutes      Faecalibacterium_prausnitzii    14.118      #F7FCF5   D30
Firmicutes      Catenibacterium_mitsuokai       12.51944    #F3F9F2   D30
Bacteroidetes   Bacteroides_ovatus              7.52241     #FFF5EB   D30
Firmicutes      Faecalibacterium_prausnitzii    21.11866    #F7FCF5   D7
Firmicutes      Ruminococcus_sp_5_1_39BFAA      13.54397    #92B09C   D7
Actinobacteria  Bifidobacterium_adolescentis    10.21989    #F7FBFF   D7
Actinobacteria  Bifidobacterium_adolescentis    38.17028    #F7FBFF   D90
Firmicutes      Catenibacterium_mitsuokai       11.04982    #F3F9F2   D90
Firmicutes      Faecalibacterium_prausnitzii    9.82507     #F7FCF5   D90
Actinobacteria  Collinsella_aerofaciens         5.2334      #D4DEE9   D90

先感谢您;我正用这个把头撞在墙上 .

代码感谢罗伯特 .

#reshape the dataframes as matrices
#species are row names and times are columns (abundance data makes up matrix)
#put the matrix times in the correct order
#create stacked barplot that has the width of column reflecting shannon index
#save the stacked barplots in files named by the entry list
for(i in 1:n){
  phyl=aggregate(abundance ~ phyla+species+color+time, dfs[[i]], sum)
  phyl=phyl[with(phyl,order(phyla,species,time)),]
  wide <- reshape(phyl, idvar = c("phyla","species","color"),
                  timevar = "time", direction = "wide")
  wide[is.na(wide)]<-0
  wide

  res1=as.matrix(wide[,-c(1:3)],ncol=dim(wide[,-c(1:3)])[2])
   colnames(res1)=
    unlist(strsplit(colnames(res1), ".", fixed = TRUE)) [seq(2,length(colnames(res1))*2,by=2)]
  rownames(res1)=wide$species
  res1 <- res1[,c('E','FMT','PA','PF','D7','D30','D90')]

  bar.width <- as.matrix(div.dfs[[i]]['frac'])

   mypath <- file.path(output.path,paste(project.name, "_", lhs[i], ".tiff", sep = ""))
  tiff(file=mypath)
  mytitle = paste(project.name, lhs[i])
  barplot(res1,col=wide$color,beside = F, width = c(bar.width), main = mytitle, legend.text=F,args.legend=
            list(x = "top",bty="n",cex=.6,ncol=2))
  dev.off()

  rm(res1)
}

#makes the legend and exports as a eps file
setwd(output.path)
plot_colors <- database$color
text <- database$species
SetEPS()
postscript('legend.eps')
plot.new()
par(xpd=TRUE)
legend("center",legend = text, text.width = max(sapply(text, strwidth)),
       col=plot_colors, lwd=1, cex=.2, horiz = F, ncol=2, bty='n')
par(xpd=FALSE)
dev.off()

1 回答

  • 0

    这是没有门的

    cols=sapply(unique(dat$species),function(sp)unique(dat$color[dat$species==sp]))
    res=tapply(dat$abundance, list(species = dat$species, time = dat$time), sum)
    res[is.na(res)]<-0
    barplot(res,col=cols,beside = F,legend.text=T,args.legend=
              list(x = "top",bty="n",cex=.6,ncol=2))
    

    这是考虑门的方法

    phyl=aggregate(abundance ~ phyla+species+color+time, dat, sum)
    phyl=phyl[with(phyl,order(phyla,species,time)),]
    wide <- reshape(phyl, idvar = c("phyla","species","color"),
              timevar = "time", direction = "wide")
    wide[is.na(wide)]<-0
    wide
    
    res1=as.matrix(wide[,-c(1:3)],ncol=dim(wide[,-c(1:3)])[2])
    colnames(res1)=
    unlist(strsplit(colnames(res1), ".", fixed = TRUE))[seq(2,length(colnames(res1))*2,by=2)]
    rownames(res1)=wide$species
    
    barplot(res1,col=wide$color,beside = F,legend.text=T,args.legend=
              list(x = "top",bty="n",cex=.6,ncol=2))
    

相关问题