Назначение цветов в столбчатой ​​диаграмме с накоплением

Я построил составной график численности видов с течением времени на трех разных участках. Код, который я создал, отображает разные виды разными цветами в зависимости от их численности на разных участках. Как я могу адаптировать код, чтобы назначать один и тот же цвет одним и тем же видам на каждом сайте. Другие вопросы связаны с назначением определенного порядка на графике, это отличается тем, что я просто хочу поддерживать один и тот же порядок в разных циклах.

library(ggplot2)
library(cowplot)
library(plyr)
library(dplyr)
library(reshape2)
dat_all =  data.frame(year = rep(1:6, 15), site= rep(c("X","Y","Z"), each=6), 
species = rep(c("A","B","C","D","E"),each=3))

dat_all$abund= c(31, 36, 23, 23,4, 29, 9, 15,32, 28, 20, 1, 9, 17, 14, 2, 3, 
        27, 23, 28, 29, 33, 16, 22, 26, 27, 14, 9, 3, 14, 15, 13, 30, 30, 4, 
        16, 18, 14, 19, 16, 19, 10, 30, 24, 34, 32, 20, 12, 
        16, 21, 23, 17, 17, 17, 28, 16, 16, 13, 30, 23,24, 16, 6, 7, 21, 22, 
        23, 3, 12, 19, 19, 39, 6, 21, 21, 14, 12, 13, 13, 22, 10, 12, 24, 
        2,21, 25, 2, 12,30, 20)


cols2a= c("#c2c387","#74aff3","#f5dc9e", "#53c6ef","#f4b189")

for (s in unique(dat_all$site)){

dat = dat_all[dat_all$site == s, ]

dat$species = as.character(dat$species)

dat$species =
  factor(
    dat$species,
    levels =
      tapply(dat$abund, dat$species, sum) %>%
      sort %>%
      names
  )
# Aggregate to site / species
dat =
  ddply(
    dat,
    c("year", "species"),
    summarize,
    abundance = sum(abund)
  )

dat$year = factor(dat$year)

dat = dat[order(dat$year, -as.numeric(dat$species)), ]

#Add labels
dat=
  ddply(
    dat,
    c("year"),
    transform,
    pos = cumsum(abundance)
  )
dat$label = dat$species
dat$label[dat$abundance < 2] = NA


# ## Plot
g= ggplot(dat, aes(x =year, y = abundance)) +
  geom_hline(yintercept = 0, size = 0.25, colour = "darkgrey") +
  geom_bar(
    aes(fill = species),
    stat = "identity", colour = "black", size = 0.25
  ) +
  geom_text(
    aes(label = label, y = pos),
  vjust = 1.25, size = 2.5
  ) +
  scale_y_continuous(
    labels = round
  ) +
  ylab("Total abundance") +
  scale_fill_manual(
    values = cols2a,
    guide = FALSE
  ) +
  ggtitle( s ) +
  theme_bw() +
  theme(
    axis.title.x = element_blank(),
    axis.ticks.x = element_blank(),
    panel.border = element_blank(),
    panel.grid = element_blank()
  )

assign(paste0("plot",s), g)
}

plot_grid(plotX,plotY,plotZ)

Как видите, цвета меняются. Например, вид B более многочислен и имеет розовый цвет на участке X, но вид D - наиболее распространенный розовый вид на участках Y и Z. Что я ошибаюсь? Мне все еще нужно, чтобы наиболее доминирующие виды находились у основания полосы, но мне нужно, чтобы цвета оставались назначенными одному и тому же виду во всех циклах.

Спасибо, введите здесь описание изображения


person Birdonawire    schedule 26.07.2017    source источник
comment
Попробуйте scale_fill_manual()   -  person Roman    schedule 26.07.2017
comment
Возможный дубликат Порядок и цвет полос на графике ggplot2 или здесь   -  person Roman    schedule 26.07.2017


Ответы (1)


Вы почти готовы, чтобы scale_fill_manual(values = cols2a) работал так, как вы хотите, вам нужно присвоить имена групп cols2a:

cols2a = c("#c2c387","#74aff3","#f5dc9e", "#53c6ef","#f4b189")
names(cols2a) = levels(dat_all$species)

В противном случае scale_fill_manual() раскрашивает группы в порядке построения.

person Andrey Kolyadin    schedule 26.07.2017