簡體   English   中英

如何在 R 中使用 ggMarginal 將箱線圖添加到直方圖

[英]How to add a boxplot to a histogram using ggMarginal in R

我想用密度曲線繪制直方圖,然后在頂部邊距上方放置一個箱線圖。 我知道如何使用hist()boxplot()layout()函數或使用ggplot2grid包中的函數來做到這一點。 但是,我正在尋找使用ggplot2ggExtra包中的ggMarginal()函數的特定解決方案。 在我提出我的問題之前,讓我們模擬一些數據:

library(ggplot2)
library(ggExtra)
set.seed(1234)
vdat = data.frame(V1 = c(sample(1:10, 100, T), 99))
vname = colnames(vdat)[1]
boxplot(vdat[[vname]], horizontal = T)

需要注意的是,我明確地將異常值 99 插入到從 1 到 10 的數字樣本中。因此,當我繪制箱線圖時,99 應該顯示為異常值。

我可以使用ggplot2輕松繪制直方圖。

p = ggplot(data=vdat, aes_string(x=vname)) + 
  geom_histogram(aes(y=stat(density)),
                         bins=nclass.Sturges(vdat[[vname]])+1,
                         color="black", fill="steelblue", na.rm=T) +
  geom_density(na.rm=T) +
  theme_bw()
p

當我嘗試使用ggMarginal添加邊緣箱線圖時,添加的箱線圖不正確。

p1 = ggMarginal(p, type="boxplot")
p1

右側的箱線圖可能是正確的。 但是最上面的那個,也就是我需要的那個,絕對是錯誤的。 離群值 99 不存在,中位數顯然不正確。

當我嘗試不提供p1 ,而是按照幫助文檔的建議提供原始數據xy ,我得到了正確的箱線圖,但直方圖現在不見了。

p2 = ggMarginal(data=vdat, x=vname, y=NA, type="boxplot", margins="x")
p2

如何組合 p1 和 p2 的正確部分,以便獲得 p1 的直方圖和 p2 的箱線圖?

我正在嘗試類似的東西

p1 + p2

或者

ggMarginal(p1, data=vdat, x=vname, y=NA, type="boxplot", margins="x")

但他們沒有工作。

根據ggMarginal的文檔, p預計是 ggplot散點圖 我們可以插入以下行作為p的第一個 geom 層:

geom_point(aes(y = 0.01), alpha = 0)

y = 0.01被選為現有圖的 y 軸范圍內的值,而alpha = 0確保該圖層不可見。

用這個p運行你的代碼應該會給你帶離群值的箱線圖。

p <- ggplot(data=vdat, aes_string(x=vname)) + 
  geom_point(aes(y = 0.01), alpha = 0) +
  geom_histogram(aes(y=stat(density)),
                 bins=nclass.Sturges(vdat[[vname]])+1,
                 color="black", fill="steelblue", na.rm=T) +
  geom_density(na.rm=T) +
  theme_bw()

p1 = ggMarginal(p, type="boxplot", margins = "x")
p1

陰謀

順便說一句,我認為在這種情況下在右側繪制箱線圖真的沒有意義,因為您尚未將任何變量分配給y

暫無
暫無

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

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