ggplot2 条形图在使用 position = "dodge" 时中断

ggplot2 barplot breaks when position = "dodge" used

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

data_long$Gebiet 的特定新标签对于我闪亮的应用程序很重要。 现在,如果我想绘制每日感染数,例如没有 position = "dodge" 的“Deutschland”(德国)和“Bayern”(巴伐利亚),我的图表如下所示,一开始没问题。

# 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, Gebiet %in% c("Deutschland", "Bayern" )), 
       mapping = aes(
         x= Meldedatum,
         y= AnzahlFall,
         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", "AnzahlFall", "Gebiet")] 

data_long %>% 
  count(Meldedatum, Gebiet, wt = AnzahlFall) %>% 
  filter(Gebiet %in% c("Deutschland", "Bayern")) %>% 
  ggplot(mapping = aes(
         x= Meldedatum,
         y= n,
         fill = Gebiet
       ))+
  geom_bar(stat = "identity", position = "dodge")