С ggplot2 поля хорошо обрабатываются для вас, но вам понадобятся данные в двух отдельных длинных формах. Измените с широкого на длинный с tidyr::gather
, tidyr::pivot_longer
, reshape2::melt
, reshape
или любым другим.
library(tidyr)
library(ggplot2)
df <- data.frame(
Total = c(584,605,664,711,759,795,863,954,1008,1061,1117,1150),
Infected = c(366,359,388,402,427,422,462,524,570,560,578,577),
Recovered = c(212,240,269,301,320,359,385,413,421,483,516,548),
Death = c(6,6,7,8,12,14,16,17,17,18,23,25),
day = seq(as.Date("2020-04-01"), as.Date("2020-04-12"), by = 'day')
)
ggplot(
tidyr::gather(df, Population, count, Total:Infected),
aes(day, count, color = Population, fill = Population)
) +
geom_line() +
geom_point() +
geom_col(
data = tidyr::gather(df, Population, count, Recovered:Death),
position = 'dodge', show.legend = FALSE
)
Другой способ сделать это это собрать дважды, прежде чем строить. Не уверен, что это легче или труднее понять, но вы получаете то же самое.
df %>%
tidyr::gather(Population, count, Total:Infected) %>%
tidyr::gather(Resolution, count2, Recovered:Death) %>%
ggplot(aes(x = day, y = count, color = Population)) +
geom_line() +
geom_point() +
geom_col(
aes(y = count2, color = Resolution, fill = Resolution),
position = 'dodge', show.legend = FALSE
)
Вы можете фактически построить линии и точки без изменения формы, делая отдельные вызовы для каждого, но чтобы увернуться от баров (или получить легенды), вам определенно нужно изменить форму.