【问题标题】:ggplot2 barplot breaks when position = "dodge" usedggplot2 barplot 在使用 position = "dodge" 时中断
【发布时间】:2021-01-16 05:52:07
【问题描述】:

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

有人知道为什么会发生这种情况以及如何解决这个问题吗?

感谢您的帮助。

【问题讨论】:

  • 为了minimal reproducible exampleminimal 部分,如果问题不是关于重塑数据,只需发布​​您正在尝试的任何数据框的示例绘制足以重现问题的情节。这使我们免于下载未知大小的文件以及十几行代码,并帮助您专注于实际问题可能是什么
  • 感谢卡米尔的建议。由于这是我关于 stackoverflow 的第一个问题,我将在以后的帖子中关注它。感谢您编辑我的图片。
  • 你可以edit帖子清理一下

标签: r ggplot2 geom-bar


【解决方案1】:

问题是您每个日期都有多个观察结果。因此,在使用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")

【讨论】:

  • 感谢您查看我的代码,即使此数据框非常庞大。对于我的下一个问题,我将使用最少的可重复示例,这样您就不必下载这么多数据来提供快速建议。感谢您的帮助!
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2012-07-21
相关资源
最近更新 更多