如何在R中使用ggMarginal将箱线图添加到直方图

时间:2018-10-17 10:51:05

标签: r ggplot2 histogram boxplot

我想绘制一条带有密度曲线的直方图,然后在顶部边缘上方放置一个箱形图。我知道如何使用hist()boxplot()layout()函数或使用ggplot2grid包中的函数来做到这一点。但是,我正在寻找使用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而是提供帮助文档建议的原始数据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")

但是它们不起作用。

1 个答案:

答案 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

plot

顺便说一句,我认为在这种情况下在右侧绘制箱形图确实没有意义,因为您没有为y分配任何变量。