簡體   English   中英

ggplot2 position_dodge影響誤差線的寬度

[英]ggplot2 position_dodge affects error bar width

我正在嘗試制作帶有誤差線的線和點圖。 它具有不同的因素,但是某些因素只有一個價值。 我發現,如果我使用position_dodge,則一個單一值因子的誤差線要比圖中的其他誤差線寬得多。 不知何故position_dodge對誤差條的寬度有影響。 我之前沒有找到遇到過相同問題的人,因此希望有人可以幫助我。

虛擬數據:

require(ggplot2)

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,3,3,5)
y <- c(3,5,6,3,5,3,5,6,2,6,3,7,3,6,2,1,5,8,7)
se <- x*0.2
treatment <- c("A", "B","C", "D","A", "B","C", "D","A", "B","C", "D","A",    "B","C", "D","E", "F", "G" )
data <- data.frame(x, y, se ,treatment)
data$treatment <- as.factor(data$treatment)

首先是沒有position_dodge的地塊-一切都很好

# Without position dodge
myplot <- ggplot(data, aes(x=x, y=y, group= treatment,  fill = treatment, colour = treatment)) +
  geom_line(stat="identity", size = 1) +
  geom_point(stat="identity", size = 3, shape = 21) + 
  geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2)

myplot

沒有position_dodge的情節

現在有位置閃避的地塊:

# With position dodge
myplot <- ggplot(data, aes(x=x, y=y, group= treatment,  fill = treatment, colour = treatment)) +
  geom_line(stat="identity", size = 1, position=position_dodge(width=0.2)) +
  geom_point(stat="identity", size = 3, shape = 21, position=position_dodge(width=0.2)) + 
  geom_errorbar(aes(ymin = y-se, ymax = y+se), width = 0.2, position=position_dodge(width=0.2))

myplot

用position_dodge繪制

如您所見,最右邊的錯誤欄的寬度比其他錯誤欄大得多。 這可能是因為此時沒有重疊的x變量,並且誤差線可以具有正常大小。 我仍然想知道如何使誤差線具有相同的寬度。

如@aosmith所建議的,解決此問題的方法是將誤差線的寬度縮放到具有x的點數。 但是,這不需要手動完成。 下面我用dplyr創建的新列data.frame基於在該點的數量x 我還刪除了group映射和fill映射,因為這里不需要(只要形狀更改為用colour而不是fill着色的填充圓的版本)。 最后,為避免重復,我只定義了一次position ,然后為每個geom使用了一個變量。

library(dplyr)
data <- data %>%
  group_by(x) %>%
  mutate(
    width = 0.1 * n()
  )

pos <- position_dodge(width = 0.2)
myplot <-
  ggplot(data,
         aes(
           x = x,
           y = y,
           colour = treatment,
           width = width
         )) +
  geom_line(size = 1, position = pos) +
  geom_point(size = 3, shape = 16, position = pos) +
  geom_errorbar(aes(ymin = y - se, ymax = y + se), position = pos)

myplot

最終影像

我過去使用的一種比較尷尬的解決方法是通過使用aes內的寬度來手動設置每個誤差線的width 每個組中的值數量告訴您縮放每個誤差線的程度。

例如,如果我有一個具有單個值的組和一個具有3個值的組,則3個width的組必須比1個width的組大3倍。

您的情況要復雜得多,因為有1組,6組和3組4組。您可以先弄清楚單個組的寬度是多少。 我選擇了.1 因此,6個組的寬度必須為.6 ,而4個組的寬度必須為.4

然后,訣竅就是弄清楚繪制線條的順序以獲得寬度。 對於更簡單的情況,這更容易。

情節代碼:

ggplot(data, aes(x = x, y = y, group = treatment,  fill = treatment, colour = treatment)) +
    geom_line(stat = "identity", size = 1, position = position_dodge(width = 0.2)) +
    geom_point(stat = "identity", size = 3, shape = 21, position = position_dodge(width = 0.2)) + 
    geom_errorbar(aes(ymin = y-se, ymax = y+se, 
                   width = c(rep(.4, 8), rep(.6, 4), rep(.4, 4), .6, .6, .1)), 
                position = position_dodge(width = 0.2))

在此處輸入圖片說明

暫無
暫無

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

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