簡體   English   中英

使用 ggplot2 的帶有誤差線的百分比堆積條形圖

[英]Percent Stacked Barplot with error bars using ggplot2

我對 R 很陌生,目前正在嘗試創建一個我以前總是使用棱鏡創建的百分比堆積條 plot。 在棱鏡中,我的圖表總是如下所示:

使用 Prism 創建的圖表

在此處輸入圖像描述

我嘗試了幾種方法,但我不確定我是否正確理解 geom_bar() function。 似乎長數據格式最適合 plot:

structure(list(run = c("particle_count_run1", "particle_count_run1", 
"particle_count_run1", "particle_count_run1", "particle_count_run1", 
"particle_count_run2", "particle_count_run2", "particle_count_run2", 
"particle_count_run2", "particle_count_run2", "particle_count_run3", 
"particle_count_run3", "particle_count_run3", "particle_count_run3", 
"particle_count_run3", "particle_count_run1", "particle_count_run1", 
"particle_count_run1", "particle_count_run1", "particle_count_run1", 
"particle_count_run2", "particle_count_run2", "particle_count_run2", 
"particle_count_run2", "particle_count_run2", "particle_count_run3", 
"particle_count_run3", "particle_count_run3", "particle_count_run3", 
"particle_count_run3", "particle_count_run1", "particle_count_run1", 
"particle_count_run1", "particle_count_run1", "particle_count_run1", 
"particle_count_run2", "particle_count_run2", "particle_count_run2", 
"particle_count_run2", "particle_count_run2", "particle_count_run3", 
"particle_count_run3", "particle_count_run3", "particle_count_run3", 
"particle_count_run3"), sample = c("2K", "2K", "2K", "2K", "2K", 
"2K", "2K", "2K", "2K", "2K", "2K", "2K", "2K", "2K", "2K", "10K", 
"10K", "10K", "10K", "10K", "10K", "10K", "10K", "10K", "10K", 
"10K", "10K", "10K", "10K", "10K", "SEC", "SEC", "SEC", "SEC", 
"SEC", "SEC", "SEC", "SEC", "SEC", "SEC", "SEC", "SEC", "SEC", 
"SEC", "SEC"), size_range = structure(c(5L, 4L, 3L, 2L, 1L, 5L, 
4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 
3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 2L, 1L, 5L, 4L, 3L, 
2L, 1L, 5L, 4L, 3L, 2L, 1L), .Label = c("5_401:1999", "4_201:399", 
"3_151:199", "2_51:149", "1_1:49"), class = "factor"), value = c(0, 
0, 4462683, 296014836, 358497149, 0, 376611, 119940, 282521877, 
318477067, 0, 0, 799317, 242354584, 385487693, 0, 3353818, 176929269, 
964906541, 220288073, 0, 7054403, 124768386, 857429863, 207014319, 
0, 14605, 117673122, 790104146, 236717487, 7772, 894924035, 62830819, 
47826581, 3787399, 247825, 776011544, 56048930, 66062865, 3264425, 
3487, 437890092, 30162534, 33433418, 0)), row.names = c(NA, -45L
), class = c("tbl_df", "tbl", "data.frame"))

使用我首先嘗試創建百分比堆積條 plot 的數據:

  tmp %>%  ggplot(aes(sample, value, fill = size_range)) +
  geom_bar(position = "fill", stat = "identity")

這實際上導致了 plot 看起來與我想要實現的非常相似:

R plot 百分比堆疊

在此處輸入圖像描述

我不確定,如果 geom_bar() function 實際上正確應用了我的數據:我有

  • 3 種不同的樣本:2K、10K、SEC
  • 對於每個樣本,我進行了 3 次測量:particle_count_run1、particle_count_run2、particle_count_run3
  • 對於這些運行中的每一個,我都有在特定尺寸范圍內測量的粒子數量:值

由於我不知道如何將所有四個變量與 geom_bar function 一起使用,因此我在 x 軸上使用樣本,在 y 軸上使用值和 size_range 作為填充。

但是,我現在不確定 geom_bar function 現在是否會自動考慮運行變量並計算平均值。 如果不是,我不確定它需要哪個值。

我遇到的另一個問題是,當條形圖堆疊時,我無法計算誤差線。 我只能用position = "dodge"向他們展示:

tmp %>%  ggplot(aes(sample, value, 
                    group = size_range, 
                    colour = size_range, 
                    fill = size_range)) +
  stat_summary(fun = mean,
               geom = "bar",
               position = "dodge") +
  stat_summary(fun.data = mean_cl_normal,
               geom = "errorbar",
               position = "dodge")

圖形

在此處輸入圖像描述

每當我嘗試更改 position 時,它不再起作用。

有誰知道我做錯了什么? 我真的很難找到 plot 的解決方案,非常感謝任何可能的幫助:)

這不是一個完整的答案,但我做了一些工作,並想分享我得到的東西,以防它幫助其他人讓你一路獲得完整的解決方案,而且評論太長了,所以這里是:

  1. 首先,似乎 ggplot 中的堆疊誤差條沒有得到很好的支持( https://stackoverflow.com/a/30873811/13210554 )但可以手動強制。
  2. 我相信您正在嘗試對重復測量( particle_count_run1particle_count_run2particle_count_run3 )進行平均,並且您希望表示這些測量的均值和方差。 我認為這是一件明智的事情,您將數據以合適的方式排列以完成此任務,並且您的圖表代表了您想要的內容。
  3. 困難的部分是讓ggplot2給你那些堆積的誤差線。 在這里,我只能讓你走一部分路……

我要在這里提出的第一點是,對於您展示的示例 plot,誤差條只會上升,這使 plot 視覺上保持清潔。 對於堆疊的 plot,我同意這種方法,但這意味着您必須修改底部誤差線計算的默認計算。

這讓我想到了正確計算堆疊誤差條的值的核心問題。 一種選擇是在ggplot調用之外執行此操作,然后將單獨的data.frame拉入stat_summary 我試圖工作但到目前為止失敗的選項是使用自定義 function 在stat_summary內部制作一個通用的解決方案。 如果它有幫助,我想分享我到目前為止所做的事情。

我以Hmisc::smean.cl.normal的膽量為出發點:

## function (x, mult = qt((1 + conf.int)/2, n - 1), conf.int = 0.95, 
##     na.rm = TRUE) 
## {
##     if (na.rm) 
##         x <- x[!is.na(x)]
##     n <- length(x)
##     if (n < 2) 
##         return(c(Mean = mean(x), Lower = NA, Upper = NA))
##     xbar <- sum(x)/n
##     se <- sqrt(sum((x - xbar)^2)/n/(n - 1))
##     c(Mean = xbar, Lower = xbar - mult * se, Upper = xbar + mult * 
##         se)
## }

您可以將其放入stat_summary調用中,並通過簡單地重命名返回變量的名稱(即upper變為ymax )產生相同的 plot :

df1 %>%  ggplot(aes(sample, value, fill = size_range)) +
  geom_col(position = "stack") +
  stat_summary(fun.data =
                 function (x,
                           mult = qt((1 + conf.int) / 2, n - 1),
                           conf.int = 0.95,
                           na.rm = TRUE)
                 {
                   if (na.rm)
                     x <- x[!is.na(x)]
                   n <- length(x)
                   xbar <- sum(x) / n
                   se <- sqrt(sum((x - xbar) ^ 2) / n / (n - 1))
                   c(ymin = xbar,
                     ymax = xbar + mult * se)
                 },
               geom = "errorbar",
               width = 0.5,
               color = "black"
  )

帶有計算出的誤差線的繪圖

請注意,現在誤差條的底部是平均值,因此它最終成為單邊誤差條。 如果您在最后的條上添加黑色輪廓以覆蓋底部尾部(除非您找到移除它的方法),它可能看起來最好。

所以現在的問題是如果從 x 軸開始,y position 應該是每個條的位置。 因此,您需要以某種方式對其進行修改,以將每個子組累積添加到該值中。 然后要將其作為fill而不是stack ,您需要除以每個組的總和以使其總計為 1。可能無法在stat_summary調用中獲取它,但也許您可以使用該代碼在外面進行計算。

暫無
暫無

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

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