将从geom_boxplot生成的箱线图强制转换为固定宽度

18

我正在制作一个箱线图,其中将xfill映射到不同的变量,有点像这样:

ggplot(mpg, aes(x=as.factor(cyl), y=cty, fill=as.factor(drv))) + 
    geom_boxplot()

在此输入图像描述

就像上面的例子一样,我的盒子在不同的 x 值处的宽度不同,因为我没有所有可能的 xfill 值的组合,所以。

我希望所有的盒子都是相同的宽度。这可行吗(最好不要操作底层数据框,因为我担心添加假数据会在进一步分析时引起混乱)?

我的第一个想法是

+ geom_boxplot(width=0.5)

但这并没有帮助;它只是针对给定的 x 因子水平调整了整个箱线图集合的宽度。

这篇文章 看起来几乎相关,但我不太清楚如何将其应用于我的情况。使用 + scale_fill_discrete(drop=FALSE) 似乎不能改变条形图的宽度。


1
这个回答解决了你的问题吗?如果按组缺失数据,箱线图的宽度是否一致? - Dima Lituiev
3个回答

3
您现在可以使用 position_dodge() 函数。
ggplot(mpg, aes(x=as.factor(cyl), y=cty, fill=as.factor(drv))) + 
    geom_boxplot(position = position_dodge(preserve = "single"))

2
问题是由于因素组合中的一些单元格不存在。可以通过xtabs检查和drv水平的所有组合的数据点数量:
tab <- xtabs( ~ drv + cyl, mpg)

tab

#    cyl
# drv  4  5  6  8
#   4 23  0 32 48
#   f 58  4 43  1
#   r  0  0  4 21

有三个空单元格。我会添加虚假数据来覆盖可视化问题。

检查因变量(y轴)的范围。虚假数据需要超出这个范围。

range(mpg$cty)
# [1]  9 35

创建一个 mpg 的子集,其中包含绘图所需的数据:

tmp <- mpg[c("cyl", "drv", "cty")]

创建空单元格的索引:
idx <- which(tab == 0, arr.ind = TRUE)

idx

#   row col
# r   3   1
# 4   1   2
# r   3   2

创建三条假线(cty值为-1):
fakeLines <- apply(idx, 1,
                   function(x) 
                     setNames(data.frame(as.integer(dimnames(tab)[[2]][x[2]]), 
                                         dimnames(tab)[[1]][x[1]], 
                                         -1), 
                              names(tmp)))

fakeLines

# $r
#   cyl drv cty
# 1   4   r  -1
# 
# $`4`
#   cyl drv cty
# 1   5   4  -1
# 
# $r
#   cyl drv cty
# 1   5   r  -1

将这些行添加到现有数据中:

tmp2 <- rbind(tmp, do.call(rbind, fakeLines))

情节:

library(ggplot2)
ggplot(tmp2, aes(x = as.factor(cyl), y = cty, fill = as.factor(drv))) + 
  geom_boxplot() +
  coord_cartesian(ylim = c(min(tmp$cty - 3), max(tmp$cty) + 3))
  # The axis limits have to be changed to suppress displaying the fake data.

enter image description here


能否将对应 cyl = 4 的方框居中?(使得数字 4 在两个方框的中间) - armandfavrot

-2

只需使用facet_grid()函数,就可以更轻松地可视化事物:

ggplot(mpg, aes(x=as.factor(drv), y=cty, fill=as.factor(drv))) + 
    geom_boxplot() +
    facet_grid(.~cyl)

enter image description here

看我如何从x = as.factor(cyl)切换到x = as.factor(drv)
完成后,您始终可以更改希望显示条带的方式并删除面板之间的边距... 它可以很容易地看起来像您期望的显示。
顺便说一下,在指定要由ggplot()使用的列之前,您甚至不需要使用as.factor()。这再次提高了代码的可读性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接