簡體   English   中英

用geom_bar和stat =“ identity”在平均值處繪制hline

[英]Plot hline at mean with geom_bar and stat=“identity”

我有一個條形圖,其中確切的條形高度在數據框中。

df <- data.frame(x=LETTERS[1:6], y=c(1:6, 1:6 + 1), g=rep(x = c("a", "b"), each=6))

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge")

在此處輸入圖片說明

現在,我要添加兩個 hline,以顯示每組所有條形的平均值。 我所擁有的

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  stat_summary(fun.y=mean, aes(yintercept=..y.., group=g), geom="hline")

在此處輸入圖片說明

因為我也想對任意數量的組執行此操作,所以我只希望使用ggplot解決方案。

我想避免這樣的解決方案,因為它不完全依賴傳遞給ggplot的數據集,具有冗余代碼並且在組數方面不靈活:

ggplot(df, aes(x=x, y=y, fill=g, group=g)) + 
  geom_bar(stat="identity", position="dodge") +
  geom_hline(yintercept=mean(df$y[df$g=="a"]), col="red") +
  geom_hline(yintercept=mean(df$y[df$g=="b"]), col="green")

提前致謝!

編輯:

  • 添加數據集
  • 評論結果代碼
  • 更改數據和繪圖以澄清問題

如果我正確理解您的問題,那么您的第一種方法就差不多了:

ggplot(df, aes(x = x, y = y, fill = g, group = g)) + 
  geom_col(position="dodge") + # geom_col is equivalent to geom_bar(stat = "identity")
  stat_summary(fun.y = mean, aes(x = 1, yintercept = ..y.., group = g), geom = "hline")

情節

根據stat_summary的幫助文件:

stat_summary對唯一的x進行操作; ...

在這種情況下, stat_summary繼承了x = xgroup = g的頂級美學映射,因此它將為g的每個值計算每個x的平均y值,從而導致許多水平線。 stat_summary的映射中添加x = 1會覆蓋x = x (同時保留group = g ),因此對於g的每個值,我們得到一個均值y值。

暫無
暫無

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

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