[英]Percent Stacked Barplot with error bars using ggplot2
我對 R 很陌生,目前正在嘗試創建一個我以前總是使用棱鏡創建的百分比堆積條 plot。 在棱鏡中,我的圖表總是如下所示:
我嘗試了幾種方法,但我不確定我是否正確理解 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 看起來與我想要實現的非常相似:
我不確定,如果 geom_bar() function 實際上正確應用了我的數據:我有
由於我不知道如何將所有四個變量與 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 的解決方案,非常感謝任何可能的幫助:)
這不是一個完整的答案,但我做了一些工作,並想分享我得到的東西,以防它幫助其他人讓你一路獲得完整的解決方案,而且評論太長了,所以這里是:
particle_count_run1
、 particle_count_run2
、 particle_count_run3
)進行平均,並且您希望表示這些測量的均值和方差。 我認為這是一件明智的事情,您將數據以合適的方式排列以完成此任務,並且您的圖表代表了您想要的內容。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.