2017-09-05 34 views
1

對於下面的數據框,我想用ggplot來製作幾個條形圖。geom_bar中的條不等寬

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,但我無法在我的例子中得到這個工作。有沒有人有解決我的問題? 很顯然,我的原始數據集要大得多,而且不同條寬的問題比我上面的例子中出現得更多。

回答

3

您可以通過填寫用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)) 
+0

謝謝!它完全不適用於我的完整數據集(一些條仍然更寬),但在將語法更改爲df2 <- df %>%group_by(Disease)%>%complete(Week,Year,fill = list(Number = 0))後,似乎上班 –

0

這很正常:在x軸上,每個單元在軸上有相同的空間(這裏是1周)。

有幾個星期只有2015年,只有2016年,沒有,或兩者都有。當兩年都有時,周單位與只有一年的時間相同。所以,當兩年都需要繪製時,「一個單位的空間」被分成兩部分,因此兩部分的空間較小。

「問題」然後不在facet_wrap上,但由於position =「dodge」,這使得酒吧並排擺放。

科林