我想绘制一条带有密度曲线的直方图,然后在顶部边缘上方放置一个箱形图。我知道如何使用hist()
,boxplot()
和layout()
函数或使用ggplot2
和grid
包中的函数来做到这一点。但是,我正在寻找使用ggplot2
包中的ggMarginal()
和ggExtra
函数的特定解决方案。在提出问题之前,让我们模拟一些数据:
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")
但是它们不起作用。
答案 0 :(得分:1)
根据ggMarginal
的文档,p
应该是ggplot scatterplot 。我们可以将以下行作为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
分配任何变量。