簡體   English   中英

ggplot2、geom_bar 和 position="dodge" 的問題:stacked 具有正確的 y 值,dodged 沒有

[英]Issue with ggplot2, geom_bar, and position="dodge": stacked has correct y values, dodged does not

我有很多時間理解geom_bar()position="dodge" 我試圖制作一些條形圖來說明兩組。 最初,數據來自兩個單獨的數據幀。 根據這個問題,我將我的數據放在長格式中。 我的例子:

test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15)
test2 <- data.frame(names=c("A","B","C"), values=5:7)

df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1, 
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values))

我使用該示例是因為它類似於支出與預算示例。 每個names因素級別的支出有很多行,而預算只有一個(每個類別一個預算金額)。

對於堆積條形圖,這很好用:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")

堆積圖

特別要注意 y 值的最大值。 它們是來自test的數據的總和,其中test2的值顯示在頂部的藍色處。

根據我讀過的其他問題,我只需要添加position="dodge"以使其成為並排圖與堆疊圖:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
geom_bar(stat="identity", position="dodge")

躲過了

它看起來不錯,但請注意新的最大值 y 值。 似乎它只是從 y 值的test中獲取每個名稱因子級別的最大 y 值。 它不再對它們求和。

對於其他一些問題(比如這個這個,我也嘗試添加group=選項但沒有成功(產生與上面相同的躲避圖):

ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")

我不明白為什么堆疊的效果很好,而躲避的不只是將它們並排而不是放在上面。


ETA:最近在 ggplot google 組上發現了一個關於此的問題,建議添加alpha=0.5以查看發生了什么。 並不是 ggplot 從每個分組中獲取最大值; 它實際上是在每個值的頂部繪制條形圖。

似乎在使用position="dodge"時,ggplot 期望每個 x 只有一個 y。 我聯系了 ggplot 開發人員 Winston Chang 以確認並詢問是否可以更改,因為我沒有看到優勢。

似乎stat="identity"應該告訴 ggplot 計算在aes()中傳遞的y=val而不是在沒有stat="identity"並且沒有傳遞 y 值時發生的單個計數。

目前,解決方法似乎是(對於上面的原始 df)進行聚合,因此每個 x 只有一個 y:

df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum)
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2)))
p <- p + geom_bar(stat="identity", position="dodge")
p

正確的

我認為問題在於您希望在num組的值堆疊,並num之間躲避。 查看向條形添加輪廓時會發生什么可能會有所幫助。

library(ggplot2)
set.seed(123)
df <- data.frame(
  id     = 1:18,
  names  = rep(LETTERS[1:3], 6),
  num    = c(rep(1, 15), rep(2, 3)),
  values = sample(1:10, 18, replace=TRUE)
)

默認情況下,有很多條形堆疊 - 除非您有輪廓,否則您不會看到它們是分開的:

# Stacked bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black")

堆疊的酒吧

如果你躲避,你會得到在num值之間躲避的條形,但在num每個值內可能有多個條形:

# Dodged on 'num', but some overplotted bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

躲在 num

如果您還將id添加為分組變量,它將避開所有這些:

# Dodging with unique 'id' as the grouping var
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(id))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

躲避所有酒吧

我認為你想要的是躲避和堆疊,但你不能兩者都做。 所以最好的辦法是自己匯總數據。

library(plyr)
df2 <- ddply(df, c("names", "num"), summarise, values = sum(values))

ggplot(df2, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge")

事先總結

  library(ggplot2)
  # bar dodge
  ggplot(iris,aes(x=Species,y=Petal.Length))+
    geom_bar(stat="identity",position="dodge",col="red")

  # bar dodge 2
  ggplot(iris,aes(x=Species,y=Petal.Length))+
    geom_bar(stat="identity",position="dodge2",col="red")

  # col dodge 2
  ggplot(iris,aes(x=Species,y=Petal.Length))+
    geom_col(position="dodge2",col="red")

reprex 包於 2022-01-22 創建 (v2.0.1)

會話信息
sessioninfo::session_info() #> ─ Session info ─────────────────────────────────────────────────────────────── #> setting value #> version R version 4.1.0 (2021-05-18) #> os Ubuntu 20.04.3 LTS #> system x86_64, linux-gnu #> ui X11 #> language en_GB:en #> collate en_GB.UTF-8 #> ctype en_GB.UTF-8 #> tz Europe/Stockholm #> date 2022-01-22 #> pandoc 2.14.0.3 @ /usr/lib/rstudio/bin/pandoc/ (via rmarkdown) #> #> ─ Packages ─────────────────────────────────────────────────────────────────── #> package * version date (UTC) lib source #> assertthat 0.2.1 2019-03-21 [1] CRAN (R 4.1.0) #> backports 1.4.1 2021-12-13 [1] CRAN (R 4.1.0) #> cli 3.1.0 2021-10-27 [1] CRAN (R 4.1.0) #> colorspace 2.0-2 2021-06-24 [1] CRAN (R 4.1.0) #> crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.0) #> curl 4.3.2 2021-06-23 [1] CRAN (R 4.1.0) #> DBI 1.1.2 2021-12-20 [1] CRAN (R 4.1.0) #> digest 0.6.29 2021-12-01 [1] CRAN (R 4.1.0) #> dplyr 1.0.7 2021-06-18 [1] CRAN (R 4.1.0) #> ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.0) #> evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.0) #> fansi 1.0.2 2022-01-14 [1] CRAN (R 4.1.0) #> farver 2.1.0 2021-02-28 [1] CRAN (R 4.1.0) #> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.0) #> fs 1.5.2 2021-12-08 [1] CRAN (R 4.1.0) #> generics 0.1.1 2021-10-25 [1] CRAN (R 4.1.0) #> ggplot2 * 3.3.5 2021-06-25 [1] CRAN (R 4.1.0) #> glue 1.6.0 2021-12-17 [1] CRAN (R 4.1.0) #> gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.0) #> highr 0.9 2021-04-16 [1] CRAN (R 4.1.0) #> htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.0) #> httr 1.4.2 2020-07-20 [1] CRAN (R 4.1.0) #> knitr 1.37 2021-12-16 [1] CRAN (R 4.1.0) #> labeling 0.4.2 2020-10-20 [1] CRAN (R 4.1.0) #> lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.0) #> magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.0) #> mime 0.12 2021-09-28 [1] CRAN (R 4.1.0) #> munsell 0.5.0 2018-06-12 [1] CRAN (R 4.1.0) #> pillar 1.6.4 2021-10-18 [1] CRAN (R 4.1.0) #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.0) #> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.0) #> R.cache 0.15.0 2021-04-30 [1] CRAN (R 4.1.0) #> R.methodsS3 1.8.1 2020-08-26 [1] CRAN (R 4.1.0) #> R.oo 1.24.0 2020-08-26 [1] CRAN (R 4.1.0) #> R.utils 2.11.0 2021-09-26 [1] CRAN (R 4.1.0) #> R6 2.5.1 2021-08-19 [1] CRAN (R 4.1.0) #> reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.0) #> rlang 0.4.12 2021-10-18 [1] CRAN (R 4.1.0) #> rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.0) #> rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.0) #> scales 1.1.1 2020-05-11 [1] CRAN (R 4.1.0) #> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.1.0) #> stringi 1.7.6 2021-11-29 [1] CRAN (R 4.1.0) #> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.0) #> styler 1.6.2 2021-09-23 [1] CRAN (R 4.1.0) #> tibble 3.1.6 2021-11-07 [1] CRAN (R 4.1.0) #> tidyselect 1.1.1 2021-04-30 [1] CRAN (R 4.1.0) #> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.0) #> vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.0) #> withr 2.4.3 2021-11-30 [1] CRAN (R 4.1.0) #> xfun 0.29 2021-12-14 [1] CRAN (R 4.1.0) #> xml2 1.3.3 2021-11-30 [1] CRAN (R 4.1.0) #> yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.0) #> #> [1] /home/roy/miniconda3/envs/r-4.1/lib/R/library #> #> ──────────────────────────────────────────────────────────────────────────────

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM