问题描述
我目前正在为大学项目开发COVID-19 Germany Shiny App。 我正在尝试制作一个图表,以显示德国不同地区级别的每日感染人数。这不是Shiny App的特定问题,而是ggplot。我在没有Shiny App环境的情况下重现了该问题。 我的基本代码如下:
require(tidyverse)
library(tidyverse)
require(lubridate)
library(lubridate)
library(readr)
require(zoo)
library(zoo)
data <- read_csv("https://opendata.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0.csv")
## Data Coding data Datensatz
data$Meldedatum <- ymd_hms(data$Meldedatum)
data$Meldedatum <- date(data$Meldedatum)
# Label Deutschland
data$label_de <- paste("Deutschland")
# Label Deutschland - Alter
data$label_de_age <- paste(data$label_de,data$Altersgruppe)
# Label Bundesland Alter
data$label_bl_age <- paste(data$Bundesland,data$Altersgruppe)
# Label SK/LK Alter
data$label_sklk_age <- paste(data$Landkreis,data$Altersgruppe)
#Data Long
data_long <- data[c( "Meldedatum","AnzahlFall","Bundesland","Landkreis","label_de_age","label_bl_age","label_sklk_age")]
data_long$Deutschland <- "Deutschland"
data_long<- pivot_longer(data_long,-c( Meldedatum,AnzahlFall),values_to = "Gebiet")
data_long<- data_long[c("Meldedatum","Gebiet")]
列data_long$Gebiet
的特定新标签对于我的闪亮应用很重要。
现在,如果我想绘制例如没有position = "dodge"
的“德国”(德国)和“拜仁”(巴伐利亚),我的图表如下所示,起初很好。
# Plot Deutschland and Bayern
ggplot(data = subset(data_long,Gebiet %in% c("Deutschland","Bayern" )),mapping = aes(
x= Meldedatum,y= AnzahlFall,fill = Gebiet
) )+
geom_bar(stat = "identity")
但是,如果我现在将position = "dodge"
行添加到geom_bar()
上,情节就会中断。如下所示。
# Plot Deutschland and Bayern with dodge
ggplot(data = subset(data_long,fill = Gebiet
) )+
geom_bar(stat = "identity",position = "dodge")
有人知道为什么会这样以及如何解决吗?
感谢您的帮助。
解决方法
问题在于您每个日期有多个观察值。因此,使用position="dodge"
时,每个日期(当然还有区域)会得到多个条形。要解决此问题,请在绘制之前按日期和地区汇总您的数据,例如通过使用count(Meldedatum,Gebiet,wt = AnzahlFall)
,它将向您的df添加一个新变量(默认情况下命名为n
),其中包含每个日期和地区的案件总数:
library(tidyverse)
library(lubridate)
library(readr)
library(zoo)
data <- read_csv("https://opendata.arcgis.com/datasets/dd4580c810204019a7b8eb3e0b329dd6_0.csv")
## Data Coding data Datensatz
data$Meldedatum <- ymd_hms(data$Meldedatum)
data$Meldedatum <- date(data$Meldedatum)
# Label Deutschland
data$label_de <- paste("Deutschland")
# Label Deutschland - Alter
data$label_de_age <- paste(data$label_de,data$Altersgruppe)
# Label Bundesland Alter
data$label_bl_age <- paste(data$Bundesland,data$Altersgruppe)
# Label SK/LK Alter
data$label_sklk_age <- paste(data$Landkreis,data$Altersgruppe)
#Data Long
data_long <- data[c( "Meldedatum","AnzahlFall","Bundesland","Landkreis","label_de_age","label_bl_age","label_sklk_age")]
data_long$Deutschland <- "Deutschland"
data_long<- pivot_longer(data_long,-c( Meldedatum,AnzahlFall),values_to = "Gebiet")
data_long<- data_long[c("Meldedatum","Gebiet")]
data_long %>%
count(Meldedatum,wt = AnzahlFall) %>%
filter(Gebiet %in% c("Deutschland","Bayern")) %>%
ggplot(mapping = aes(
x= Meldedatum,y= n,fill = Gebiet
))+
geom_bar(stat = "identity",position = "dodge")