R ggplot2 настроить легенду с несколькими geom_bar в одном кадре данных - PullRequest
1 голос
/ 21 мая 2019

Мой вопрос близок к этому Легенды о множественных заливках в ggplot и все же не одно и то же.Позвольте мне объяснить.

У меня есть фрейм данных, который выглядит следующим образом:

df <- data.frame(
  'sf'=c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'), 
  'totalsf'=c(28, NA, NA, 32, NA, NA, 40, NA, NA),
  'sl' = c('A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'),
  'totalsl' = c(35, NA, NA, 40, NA, NA, 25, NA, NA),
  'min' = c('aa', 'bb', 'cc', 'aa', 'bb','cc', 'aa', 'bb', 'cc'),
  'totalmin' = c(30, 4, 0, 8, 0, 25, 8, 9, 16),
  'id' = c(1,2,3,4,5,6,7,8,9))

Я в основном хочу построить totalsf с sf как заливку, totalsl с sl как заливку и totalmin с minкак заполнение, все с geom_bar, следующим образом:

g <- ggplot(df  %>% mutate(id = id), aes(group=id))
g <- g + geom_bar(aes(x=0, y=totalsf, fill=sf), width=.05, stat="identity")
g <- g + geom_bar(aes(x= 0.05, y=totalsl, fill=sl), width=.05, stat="identity")
g <- g + geom_bar(aes(x=0.1, y=totalmin, fill=min), width=.05, stat="identity")
g <- g + theme_light()
g <- g + theme(axis.title.x=element_blank(),
               axis.text.x=element_blank(),
               axis.ticks.x=element_blank(),
               legend.position="bottom")
g <- g + labs(x = "Variable", y = "y", fill = "x")
g <- g + scale_y_continuous(breaks=seq(0, 100, by=10))
print(g)

Это дает следующий график:

enter image description here

Имейте в виду,это то, что я хочу (и я также знаю, как изменить цвета, но давайте не будем перегружать код).В этом суть моей проблемы: легенда отвратительна, в идеале я хотел бы, чтобы три переменные имели собственную легенду, а не в алфавитном порядке, как сейчас.Кто-нибудь знает, как настроить легенду так, чтобы у каждой переменной была своя легенда?(в основном "sf" в качестве заголовка с цветами a, b, c, "sl" в качестве заголовка с цветами A, B, C и "min" в качестве заголовка с цветами aa, bb, cc).

Заранее спасибо за ваши ответы!

Лучший,

Натали

1 Ответ

2 голосов
/ 21 мая 2019

Я не знаю простого трюка, но его пакет ggnewscale позволяет отображать несколько переменных одновременно в нескольких масштабах, что приводит к тому, что легенды имеют несколько названий.Вам нужно будет указать масштаб, а затем указать, что вы хотите переопределить масштаб.Пример на основе вашего кода:

library(ggnewscale)

g <- ggplot(df %>% mutate(id = id), aes(group = id)) +
  # Note geom_col is shorthand for geom_bar(stat = "identity")
  geom_col(aes(x = 0, y = totalsf, fill = sf), width = 0.05) +
  # Scale has to be specified, not giving colour values will
  # result in all scales being red blue and green.
  # guide_legend(order = 1) ensures that the legends appear in your
  # order instead of alphanumerically
  scale_fill_manual(values = c("red", "green", "blue"), 
                    guide = guide_legend(order = 1)) +
  new_scale_fill() +
  geom_col(aes(x = 0.05, y = totalsl, fill = sl), width = 0.05) +
  scale_fill_manual(values = c("yellow", "magenta", "cyan"), 
                    guide = guide_legend(order = 2)) +
  new_scale_fill() +
  geom_col(aes(x = 0.1, y = totalmin, fill = min), width = 0.05) +
  scale_fill_manual(values = c("black", "grey50", "white"), name = "min") +
  theme_light() +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        legend.position="bottom") +
  labs(x = "Variable", y = "y", fill = "x") +
  scale_y_continuous(breaks=seq(0, 100, by=10))

enter image description here

...