R Легенда ggplot с неожиданным выводом

#r #ggplot2 #plot #label #legend

#r #ggplot2 #график #метка #легенда

Вопрос:

Я работаю над R-графиком некоторых данных о COVID, отображая случаи с течением времени в Китае и совокупные случаи в других странах. Я также добавляю несколько вертикальных линий, отмечающих некоторые события. У меня много проблем с легендой. Я хотел бы иметь возможность показать 2 варианта: Вариант 1: а) легенда для случаев в разных странах (Китай против других) б) легенда для отмеченных событий показывает вертикальные линии.

ИЛИ вариант 2: просто легенда для случаев страны (Китай против других) и полагаться на метки для отображения информации о вертикальной линии.

Однако то, что отображается в легенде моего графика, показывает как информацию о стране, так И информацию о вертикальной линии в одном блоке (см. Ниже): введите описание изображения здесь

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

 library(readr)
library(ggplot2)
library(dplyr)
library(tidyr)
library(ggrepel)
devtools::install_github("RamiKrispin/coronavirus")


library(coronavirus)
update_dataset()    

summary_china <- coronavirus %>% 
  filter(type == "confirmed" amp; country == "China") %>%
  group_by(date) %>% summarise(total_cases = sum(cases)) %>% mutate(country = "China") %>%
  arrange(date) 

summary_not_china <- coronavirus %>% 
  filter(type == "confirmed" amp; country != "China") %>%
  group_by(date) %>% summarise(total_cases = sum(cases)) %>% mutate(country = "Others") %>%
  arrange(date) 

summary_by_cases <- rbind(summary_china, summary_not_china)

#confirmed cases China vs. the rest of the world
plot_companrison <- summary_by_cases %>% ggplot(show.legend = FALSE)  
  geom_line(aes(x=date,y=total_cases, color=country), show.legend = TRUE)  
  ylab("Cumulative confirmed cases")

who_events <- tribble(
  ~ date, ~ event,
  "2020-01-30", "Global healthnemergency declared",
  "2020-03-11", "Pandemicndeclared",
  "2020-02-13", "China reportingnchange"
) %>%
  mutate(date = as.Date(date))


plot_companrison   
  geom_vline( aes(xintercept = date,  color=event),  data=who_events, show.legend = FALSE)  
  geom_label_repel(aes(x=date, label=event, color=event), data=who_events, y=2e5, force=200, show.legend = FALSE) 
 
  
  

Как мне либо удалить события из легенды страны, либо иметь 2 отдельные легенды, одну для событий и одну для стран? TIA

Комментарии:

1. Попробуйте установить breaks in scale_color_discrete() для любых групп, которые вы хотите включить в легенду. Что-то вроде scale_color_discrete(breaks = c("China", "Other") ) .

Ответ №1:

Попробуйте этот подход. Но необходимо упомянуть, что рекомендация от @aosmith — самый практичный способ получить то, что вы хотите (я протестировал и работает идеально. Это делает ее довольно крутой и умной леди, опередив меня на секунду, когда я собирался выпустить это решение). Здесь аналогичный подход, но с использованием annotate() :

Сначала данные:

 library(tidyverse)
library(coronavirus)
library(ggrepel)
update_dataset()
#Data
summary_china <- coronavirus %>% 
  filter(type == "confirmed" amp; country == "China") %>%
  group_by(date) %>% summarise(total_cases = sum(cases)) %>% mutate(country = "China") %>%
  arrange(date) 

summary_not_china <- coronavirus %>% 
  filter(type == "confirmed" amp; country != "China") %>%
  group_by(date) %>% summarise(total_cases = sum(cases)) %>% mutate(country = "Others") %>%
  arrange(date) 

summary_by_cases <- rbind(summary_china, summary_not_china)

#Data for events
who_events <- tribble(
  ~ date, ~ event,
  "2020-01-30", "Global healthnemergency declared",
  "2020-03-11", "Pandemicndeclared",
  "2020-02-13", "China reportingnchange"
) %>%
  mutate(date = as.Date(date))
  

Теперь код для построения:

 #Plot
ggplot(data=summary_by_cases,aes(x=date,y=total_cases,
                                 color=country)) 
  geom_line() 
  geom_vline(xintercept=who_events$date,
             color=c('red','green','blue')) 
  annotate(geom = 'label_repel',x=who_events$date,y=2e5,
                 label=who_events$event,
           color=c('red','green','blue'),force=200)
  

Вывод:

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