Как изменить двухстороннюю столбчатую диаграмму с накоплением

Я использую столбчатую диаграмму для отображения относительного доминирования видов.

Гистограмма создается с помощью следующего кода:

RelDom <- RelDom[order(RelDom[,2]),] # rank by column A
RelDom

RelDom %>%
  gather(LU, RD, -species) -> likert
likert

likert %>%
  filter(LU=="A") %>%
  arrange(RD) %>% .$species -> ind_order
ind_order


likert %>%
  mutate(species=factor(species, levels=ind_order, ordered=TRUE)) %>%
  mutate(LU=factor(LU,
                        levels=c("A", "C", "B"), ordered=F,
                        labels=c("A", "C", "B"))) -> lik
lik


tiff(file = "RD.tiff", height=10, width=20, units="in", res=300, compression="lzw")
ggplot() +
  geom_hline(yintercept=0, lwd=1) +
  geom_bar(data=lik, width=.75,
           stat="identity", position="stack",
           aes(x=species, y=RD, fill=LU)) +

  annotate("text", x = 2, y=-50, label = "Old", size=8) +
  annotate("text", x = 2, y=70, label = "New", size=8) +

  scale_x_discrete(limits = rev(levels(lik$species)),expand=c(0,0)) +
  scale_fill_manual(values=c( "darkgreen", "red","blue"),
                    drop=FALSE) +
  scale_y_continuous(expand=c(0,0),
                     limits=c(-100, 200),
                     breaks=c(-100,-50,0,50,100),
                     labels=c("100","50","0","50","100")) +
  coord_flip() +
  xlab("Species") +
  ylab("Relative Dominance") +
  theme_bw() +
  theme(legend.position = c(0.9, 0.1)) +
  theme(legend.title = element_blank()) +
  theme(legend.text = element_text(colour="black", size = 14)) +
  theme(legend.background = element_rect(fill="white", size=0.5, linetype="solid", colour ="black")) +
  theme(axis.title.x = element_text(vjust=0.5,face="bold", size=16),
        axis.text.x = element_text(vjust=4, size=14)) +
  theme(axis.title.y = element_text(angle=90, vjust=0.70, face="bold", size=18),
        axis.text.y = element_text(size=14)) +
  theme(panel.grid.minor=element_blank()) +
  theme(panel.grid.major.y = element_blank()) +
  theme(panel.grid=element_blank()) +
  theme(panel.border = element_rect(size=1, color = "black")) +
  theme(plot.margin = unit(c(0.2,0.9,0.3,0.2),"lines"))
dev.off()

Фигура выглядит следующим образом:

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

Теперь, вместо того, чтобы складывать синий и красный по горизонтали, я хотел бы, чтобы каждый синий столбец располагался непосредственно поверх соответствующего красного столбца. Это должно быть так, чтобы и синий, и красный столбцы были только половину своей текущей ширины, чтобы вместе они соответствовали ширине зеленого столбца.

Кроме того, я изо всех сил пытаюсь заставить легенду отображаться в порядке зеленого, синего и красного.

Большое спасибо за любой совет.

Это воспроизводимые данные: dput (RelDom):

structure(list(species = structure(c(1L, 8L, 9L, 10L, 11L, 12L, 
13L, 14L, 15L, 2L, 3L, 4L, 5L, 6L, 7L), .Label = c("Sp1", "Sp10", 
"Sp11", "Sp12", "Sp13", "Sp14", "Sp15", "Sp2", "Sp3", "Sp4", 
"Sp5", "Sp6", "Sp7", "Sp8", "Sp9"), class = "factor"), A = c(-73.55, 
-72.42, -35.62, -12.45, -8.89, -7.26, -6.6, -6.42, -6.02, -5.26, 
-4.59, -4.31, -3.53, -3.25, -2), B = c(64.54, 88.06, 39.57, 14.64, 
6.6, 10.55, 3.87, 7.35, 5.09, 1.88, 6.84, 10.34, 2.17, 2.36, 
1.36), C = c(47.35, 78.55, 39.35, 21.96, 6.25, 7.64, 3.28, 8.94, 
3, 6.04, 5.16, 3.63, 5.42, 12.34, 5.03)), .Names = c("species", 
"A", "B", "C"), row.names = c(NA, 15L), class = "data.frame")

person tabtimm    schedule 16.09.2017    source источник


Ответы (1)


Если я правильно понял, вы хотите, чтобы синяя и зеленая полосы были рядом, а зеленая - в том же положении, что и сейчас.

Сделайте два geom_bar, один без A и dodge, и один только с A и stack. Что касается порядка цветов в легенде, если вы хотите, чтобы легенда была A, B, C, измените порядок уровней в LU. Я предполагаю, что это не то, что вы имеете в виду, поскольку вы специально используете эту строку:

....
mutate(LU=factor(LU,
                        levels=c("A", "C", "B"), ordered=F,
                        labels=c("A", "C", "B"))) -> lik 

Итак, я думаю, вы хотите, чтобы C был blue и B, red просто измените color_fill_manual строку: scale_fill_manual(values=c( "darkgreen", "blue", "red")

library(ggplot2)
ggplot() +
  geom_bar(data=lik[lik$LU!="A",], width=.75,
           stat="identity", position="dodge",
           aes(x=species, y=RD, fill=LU)) +
  geom_bar(data=lik[lik$LU=="A",], width=.75,
           stat="identity", position="stack",
           aes(x=species, y=RD, fill=LU)) +
  geom_hline(yintercept=0, lwd=1) +
  annotate("text", x = 2, y=-50, label = "Old", size=8) +
  annotate("text", x = 2, y=70, label = "New", size=8) +

  scale_x_discrete(limits = rev(levels(lik$species)),expand=c(0,0)) +
  scale_fill_manual(values=c( "darkgreen", "blue", "red"),
                    drop=FALSE) +
  scale_y_continuous(expand=c(0,0),
                     limits=c(-100, 200),
                     breaks=c(-100,-50,0,50,100),
                     labels=c("100","50","0","50","100")) +
  coord_flip() +
  xlab("Species") +
  ylab("Relative Dominance") +
  theme_bw() +
  theme(legend.position = c(0.9, 0.1)) +
  theme(legend.title = element_blank()) +
  theme(legend.text = element_text(colour="black", size = 14)) +
  theme(legend.background = element_rect(fill="white", size=0.5, linetype="solid", colour ="black")) +
  theme(axis.title.x = element_text(vjust=0.5,face="bold", size=16),
        axis.text.x = element_text(vjust=4, size=14)) +
  theme(axis.title.y = element_text(angle=90, vjust=0.70, face="bold", size=18),
        axis.text.y = element_text(size=14)) +
  theme(panel.grid.minor=element_blank()) +
  theme(panel.grid.major.y = element_blank()) +
  theme(panel.grid=element_blank()) +
  theme(panel.border = element_rect(size=1, color = "black")) +
  theme(plot.margin = unit(c(0.2,0.9,0.3,0.2),"lines"))

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

person missuse    schedule 16.09.2017
comment
Отлично, спасибо, это именно то, на что я надеялся. Что касается легенды, если я изменю порядок в функции mutate() или в строке color_fill_manual, данные и соответствующие цвета будут перепутаны. Может быть, это связано с тем, что R по умолчанию упорядочивает метки столбцов в алфавитном порядке (я должен сказать, что мои фактические заголовки столбцов - A = OG, B = LIL, C = HIL, я использовал A, B, C, чтобы упростить задачу; но, конечно, это удаляет потенциальная проблема с алфавитным порядком). - person tabtimm; 17.09.2017
comment
Рад, что это было полезно. Вы пробовали: ...scale_fill_manual(values=c("OG" = "darkgreen", "HIL" = "blue", "LIL" = "red")) - person missuse; 17.09.2017
comment
Спасибо, работает. Однако, хотя я получаю правильную комбинацию, то есть HIL = синий и LIL = красный, порядок - OG, HIL, LIL, а не OG, LIL, HIL, что возвращает меня к проблеме, когда я меняю порядок уровней в Код mutate (), то есть уровни = c (OG, LIL, HIL), цвета и базовые данные больше не совпадают (тогда как порядок легенды правильный). Интересно, могу ли я что-то изменить в исходном файле .csv, т.е. использовать A, B, C вместо OG, LIL, HIL, а затем переименовать в OG, LIL, HIL в R, чтобы избежать проблемы с алфавитным порядком? - person tabtimm; 17.09.2017