Barplot рядом и линейные графики на одном участке - PullRequest
1 голос
/ 13 апреля 2020

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

https://www.corona-os.de/startseite/

Я пытался:

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 <- itemizeDates(startDate="01.04.20", endDate="12.04.20")

df <- data.frame(Day=day, Infected=Infected, Recovered=Recovered, Death=Death, Total=Total)

value_matrix = matrix(, nrow = 2, ncol = 12)
value_matrix[1,] = df$Recovered
value_matrix[2,] = df$Death

plot(c(1:12), df$Total, ylim=c(0,1200), xlim=c(1,12), type = "b", col="peachpuff", xaxt="n", xlab = "", ylab = "")
points(c(1:12), df$Infected, type = "b", col="red")
barplot(value_matrix, beside = TRUE, col = c("green", "black"), width = 0.35, add = TRUE)

Но гистограмма не соответствует линейному графику. Я думаю, было бы проще использовать ggplot2, но не знаю как. Кто-нибудь может мне помочь? Большое спасибо заранее!

1 Ответ

0 голосов
/ 13 апреля 2020

С 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
    )

plot with lines and bars

Другой способ сделать это это собрать дважды, прежде чем строить. Не уверен, что это легче или труднее понять, но вы получаете то же самое.

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
    )

same plot

Вы можете фактически построить линии и точки без изменения формы, делая отдельные вызовы для каждого, но чтобы увернуться от баров (или получить легенды), вам определенно нужно изменить форму.

...