簡體   English   中英

如何修復 R 中 ggplot2 的 geom_jitter() 的不穩定 y 位置?

[英]How to fix unstable y-positions for geom_jitter() for ggplot2 in R?

我正在做一個帶有箱線圖的常見 R ggplot2 圖:箱線圖補充了單個樣本,如 geom_jitter() 所示的點,以顯示每個組中的單個樣本位置和數量。 通常我沒有注意到問題,但是根據最近的一些數據,我注意到抖動的 y position 存在很大的不准確性和變化。 但是,箱線圖相對於 Y 保持穩定,geom_point() 在用於顯示與抖動繪制相同的點時也是如此。 當您有許多數據點時,錯誤可能不明顯,但如果需要對一組中的 5-10 個樣本執行某些操作,則可能會產生明顯的錯誤,如果您不知道該問題,則可能會誤導您.

我一開始以為這可能一直都在發生,我沒有注意到,所以我做了一些隨機數,並用 geom_jitter() 做了一個 ggplot,但一開始問題就消失了。 給出了一些示例數據和圖表來顯示正常和有問題的情況。

數據生成和繪圖按預期工作:

df <- data.frame("X" = rep("X", 5), "Y" = rnorm(5, 100, 30))

檢查 plot:

library(ggplot2)
ggplot(df, aes(X, Y)) + geom_boxplot() + geom_jitter(col = "red") + geom_point(col = "blue")

紅點和藍點幾乎完全對齊,如果重復代碼 5 次,您可以看到 plot 預覽 RStudio 並且沒有注意到抖動點 y 位置的變化(如預期的那樣,僅沿 X 軸水平)。 在像下面這樣的有問題的情況下,您很快就會看到 y 軸點的變化,尤其是因為它有時會改變 y 軸的范圍。

隨着隨機數的更多變化,我發現紅色和藍色點之間存在明顯差異,每次繪制相同數據時都會有所不同:

df <- data.frame("X" = rep("X", 5), "Y" = rnorm(5, 100, 400))

得到這個問題的實際數字是:

  X          Y
1 X  610.78026
2 X  -38.58905
3 X -196.00943
4 X   94.37797
5 X  415.58417

在我的結果中,最低點 -196 有時約為 -170,有時約為 -250。 y 軸的范圍每次移動。 這類似於我在真實數據中遇到的問題。 我發現在其他數據測試中,方差更大或點之間的范圍更大,並不能解釋抖動 y 位置的發生變異性。 在某些方差更大的情況下,geom_jitter() 再次產生接近完美的 y 位置。 所以我想知道它是否可能與 ggplot2 使用的某些 plot 區域的映射問題有關。 我想通過強制 ggplot 使用ylim(-206, 621)保持相同的 ylimit 來測試它,但它未能通過上述有問題的情況停止該區域。 它給出了一個神秘但一致的錯誤:“警告消息:刪除了 1 行包含缺失值 (geom_point)。” (In the corresponding plot, it lost the red jitter point for the 610.7 value, despite enough pixel space in the plot preview window for about 10 more points between the blue point and the top of the graph. In another attempt, 2 jitter points get丟失,因為底部有時會超過下限)。

一個迂回的解決方案是為 X 組制作隨機點,所有點都保持相同的 Y 和組標識,但這不是有效的。 當在 X 上使用非數字組時,我發現對於添加的任何標簽,它的數字 position 將為 1。 將以下內容添加到最后一個 dataframe 會給出正確的外觀+ geom_point(aes(x= rnorm(5, 1, .2), y = Y), col = "yellow") - 但如果有很多,那將變得非常麻煩如果沒有某種方法可以自動為箱線圖組獲取正確的 X position,則進行分組。

為了解決這個問題,任何關於它的原因是什么的輸入都會有很大的幫助。

聽起來您不想要默認的geom_jitter行為,它在繪圖之前分別向 x 和 y 值添加均勻分布的噪聲量,默認情況下“數據分辨率的 40%:這意味着抖動值將占據 80 % 的隱含 bin。"

對於像您這樣的連續變量,“分辨率”是“相鄰值之間的最小非零距離。

嘗試這個:

geom_jitter(col = "red", height = 0) + 

這將告訴 ggplot 在繪圖之前您不希望對 y 值應用任何噪聲。

另一種方法是在繪圖步驟之前自己添加噪聲,使您能夠專門控制其分布和范圍。

例如,不是讓抖動填充一個統一的矩形:...

library(dplyr)
tibble(x = rep(1:2, each = 1000),
       y = rep(3:4, each = 1000)) -> point_data
  ggplot(point_data, aes(x,y)) + geom_jitter()

在此處輸入圖像描述

我們可以添加我們想要的任何噪聲 function。 在這里,沒有特別的原因,我圍繞真實數據制作甜甜圈,並將其與默認抖動進行比較:

point_data %>%
  mutate(angle = runif(2000, 0, 2*pi),
         dist  = rnorm(2000, 0.3, 0.05),
         x2    = x + dist*cos(angle),
         y2    = y + dist*sin(angle)) %>%
  ggplot() + 
    geom_jitter(aes(x,y), color = "red", alpha = 0.2) +
    geom_point(aes(x2,y2))

在此處輸入圖像描述

暫無
暫無

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

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