Сложный столбчатый график в R с использованием цветного столбца

Я пытаюсь создать столбчатую диаграмму с накоплением, используя 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()

person shadowofzedark    schedule 11.06.2015    source источник
comment
возможный дубликат гистограммы с накоплением в R   -  person Michal    schedule 11.06.2015
comment
Вы можете использовать пакет reshape2. Функции cast и melt могут помочь вам изменить данные в более удобный формат.   -  person Michal    schedule 11.06.2015
comment
Не могли бы вы объяснить, что вы имеете в виду? Кроме того, решит ли это проблему с раскраской шестнадцатеричного кода?   -  person shadowofzedark    schedule 11.06.2015


Ответы (1)


Это без типа

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))

person Robert    schedule 11.06.2015
comment
Не знаю почему, но это не соответствует цветам правильно. Длина cols не соответствует количеству видов в матрице res. Могу ли я решить проблему группировки типов, сопоставив филы с видами в матрице res, переупорядочив матрицу по типам, а затем сделав гистограмму из переупорядоченной матрицы с удаленным столбцом phyla? - person shadowofzedark; 11.06.2015
comment
Да, единственное, что вам нужно учитывать, это изменить порядок столбцов, так как вы измените порядок видов ... Я попытаюсь загрузить сюжет, который я получил здесь. - person Robert; 12.06.2015