Как изменить легенду в этом графике ggplot? - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь изменить легенду моего графика ggplot, но мне не удается это сделать. Это мой df и мой код для графика:

#df
df = structure(list(Date = structure(c(18319, 18320, 18321, 18322, 
18323, 18324, 18325, 18326, 18327, 18328, 18329, 18330, 18331, 
18332, 18333, 18334, 18335, 18336, 18337, 18338, 18339, 18340, 
18341, 18342, 18343), class = "Date"), Daily_Cases = c(250, 238, 
240, 566, 342, 466, 587, 769, 778, 1247, 1492, 1797, 977, 2313, 
2651, 2547, 3497, 3590, 3233, 3526, 4207, 5322, 5986, 6557, 5560
), Tests = c(2427, 3681, 2966, 2466, 2218, 2511, 3981, 2525, 
3997, 5703, 7875, 3889, 6935, 12393, 12857, 11477, 11682, 15729, 
13063, 10695, 16884, 17236, 24109, 26336, 25180), Proportion = c(10.3, 
6.5, 8.1, 23, 15.4, 18.6, 14.7, 30.5, 19.5, 21.9, 18.9, 46.2, 
14.1, 18.7, 20.6, 22.2, 29.9, 22.8, 24.7, 33, 24.9, 30.9, 24.8, 
24.9, 22.1)), class = "data.frame", row.names = c(NA, -25L))


df <- df %>% pivot_longer(names_to = 'Legend', values_to = 'value', Tests:Daily_Cases) 

ggplot(df) + theme_bw() +
  geom_col(aes(Date, value, fill = Legend), position = position_dodge()) +
  geom_line(aes(Date, Proportion*1000, colour = "Infected (%)", group = 1), size = 0.8) + scale_y_continuous("\n", sec.axis = sec_axis(~ . /1000, name = "(%) \n")) + labs(x="", y="") + 
  scale_colour_manual(" ", values=c("Infected (%)" = "black")) +
  theme(legend.position = "bottom")

Это результат:

enter image description here

Однако я хочу чтобы можно было удалить слово Легенда , а также изменить слова Daily_Cases и Тесты на Количество дел и Количество Тесты соответственно.

Мне не удается это сделать. Кто-нибудь может мне помочь?

Ответы [ 3 ]

4 голосов
/ 23 марта 2020

Все ответы на ваши вопросы - это изменения, примененные к вашему коду , основанные на ответе здесь на связанный вопрос о работе с легендами в ggplot . Самый простой способ - добавить вызов к scale_fill_manual(), аналогично тому, что вы уже сделали с scale_color_manual():

ggplot(df) + theme_bw() +
    geom_col(aes(Date, value, fill = Legend), position = position_dodge()) +
    geom_line(aes(Date, Proportion*1000, colour = "Infected (%)", group = 1), size = 0.8) + 
    scale_y_continuous("\n", sec.axis = sec_axis(~ . /1000, name = "(%) \n")) + labs(x="", y="") + 
    scale_colour_manual(" ", values=c("Infected (%)" = "black")) +
    theme(legend.position = "bottom") +
    scale_fill_manual("", values=c('Daily_Cases'='blue', 'Tests'='red'), labels=c('Numer of Cases', 'Number of Tests'))

Давать вам ниже (вы можете изменить цвета на любой, какой захотите, но я думаю, что это это то, что вы искали):

enter image description here

Как указал другой пользователь, вы можете использовать scale_fill_discrete(), чтобы просто сохранить цвета по умолчанию и только указать метки:

ggplot(df) + theme_bw() +
    geom_col(aes(Date, value, fill = Legend), position = position_dodge()) +
    geom_line(aes(Date, Proportion*1000, colour = "Infected (%)", group = 1), size = 0.8) +
    scale_y_continuous("\n", sec.axis = sec_axis(~ . /1000, name = "(%) \n")) + labs(x="", y="") + 
    scale_colour_manual(" ", values=c("Infected (%)" = "black")) +
    theme(legend.position = "bottom") +
    scale_fill_discrete("", labels=c('Numer of Cases', 'Number of Tests'))
4 голосов
/ 23 марта 2020

Один подход - scale_fill_discrete.

ggplot(df) + theme_bw() +
  geom_col(aes(Date, value, fill = Legend), position = position_dodge()) + 
  scale_fill_discrete(name=NULL,labels=c("Number of Cases","Number of Tests")) +
  geom_line(aes(Date, Proportion*1000, colour = "Infected (%)", group = 1), size = 0.8) + scale_y_continuous("\n", sec.axis = sec_axis(~ . /1000, name = "(%) \n")) + labs(x="", y="") + 
  scale_colour_manual(" ", values=c("Infected (%)" = "black")) +
  theme(legend.position = "bottom")
3 голосов
/ 23 марта 2020

Все правильные ответы, но я бы просто использовал именованный вектор в scale_fill_ etc

Это не только вопрос удобства, но и более безопасный, поскольку вы лучше контролируете свою маркировку.

Кроме того, не используйте name = '', потому что «что-то» будет нарисовано. Используйте NULL вместо

ggplot(df) + theme_bw() +
  geom_col(aes(Date, value, fill = Legend), position = position_dodge()) +
  geom_line(aes(Date, Proportion*1000, colour = "Infected (%)", group = 1), size = 0.8) + scale_y_continuous("\n", sec.axis = sec_axis(~ . /1000, name = "(%) \n")) + labs(x="", y="") + 
  scale_colour_manual(" ", values=c("Infected (%)" = "black")) +
  theme(legend.position = "bottom") +
scale_fill_brewer(name = NULL, labels = c(Daily_Cases = 'Number of cases', Tests = 'Number of Tests'))
...