[英]How to add a boxplot to a histogram using ggMarginal in R
我想用密度曲線繪制直方圖,然后在頂部邊距上方放置一個箱線圖。 我知道如何使用hist()
、 boxplot()
和layout()
函數或使用ggplot2
和grid
包中的函數來做到這一點。 但是,我正在尋找使用ggplot2
和ggExtra
包中的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
,而是按照幫助文檔的建議提供原始數據x
和y
,我得到了正確的箱線圖,但直方圖現在不見了。
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.