geom_bar中的条形宽度不相等

时间:2017-09-05 07:09:21

标签: r ggplot2 geom-bar

对于以下数据框,我想使用ggplot制作几个条形图。

df <- data.frame(Disease = c("Disease1","Disease2","Disease3","Disease3","Disease3","Disease4","Disease5","Disease5","Disease6","Disease4","Disease2","Disease2","Disease1","Disease7","Disease1","Disease1","Disease7","Disease6","Disease3","Disease6"),
                   Week = c(3,52,46,47,19,39,42,46,44,45,46,42,45,48,44,44,43,42,45,47),
                   Year = c(2015,2015,2015,2016,2015,2015,2016,2016,2015,2015,2015,2015,2016,2016,2016,2015,2016,2016,2016,2015),
                   Number = c(1,1,6,5,1,1,4,12,4,15,6,15,6,11,4,2,9,1,4,1))

我使用以下语法给出了几个条形图。

ggplot(df, aes(factor(Week), Number )) + 
  geom_bar(stat="identity" , aes(fill = factor(Year)), position = "dodge") + 
  facet_wrap(~ Disease, ncol = 2, scales = "free_y") +
  labs(x = "Week", y = "Number") +
  scale_fill_discrete(name = "Year")

enter image description here

但是,我希望所有条形都具有相同的宽度(参见疾病1的宽度差异)。我已经在Bars in geom_bar have unwanted different widths when using facet_wrap找到了答案,但我不能在我的例子中找到它。有没有人能解决我的问题? 显然,我的原始数据集要大得多,并且不同条宽的问题比我上面的例子更频繁。

2 个答案:

答案 0 :(得分:5)

您可以通过填写每个疾病+周+年的0的数据集来解决此问题:

library(tidyverse)
df2 = df %>%
    complete(Disease, Week, Year, fill = list(Number = 0))

ggplot(df2, aes(factor(Week), Number )) + 
    geom_bar(stat="identity" , aes(fill = factor(Year)), position = "dodge") + 
    facet_wrap(~ Disease, ncol = 2, scales = "free_y") +
    labs(x = "Week", y = "Number") +
    scale_fill_discrete(name = "Year")

您也可以尝试使用0.1这样的小数字填充,这样您就可以在每个x轴位置获得一些细小的条形图 - 我认为这有助于明确每个条形图有一个空间,但是您引入的可能会让人感到困惑假值:

df2 = df %>%
    complete(Disease, Week, Year, fill = list(Number = 0.1))

答案 1 :(得分:0)

这是正常的:在x轴上,每个单位在轴上都有相同的空间(这里是1周)。

有几个星期只有2015年,2016年,没有,或两者兼而有之。当有两年时,周单位与仅一年时相同。因此,当有两年的时间被绘制时,“单位的空间”被分成两部分,因此条形的两倍小。

“问题”然后不在facet_wrap上,而是由于position =“dodge”,它将条形放在一边。

科林