当使用position =“ dodge”时,ggplot2 barplot中断

问题描述

我目前正在为大学项目开发​​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")

Plot1 without dodge

但是,如果我现在将position = "dodge"添加geom_bar()上,情节就会中断。如下所示。

# Plot Deutschland and Bayern with dodge
ggplot(data =  subset(data_long,fill = Gebiet
       ) )+
  geom_bar(stat = "identity",position = "dodge")

Plot2 with 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")