#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
inscale_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)
Вывод: