gpt4 book ai didi

r - 强制箱线图从 geom_boxplot 到恒定宽度

转载 作者:行者123 更新时间:2023-12-03 23:58:35 25 4
gpt4 key购买 nike

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

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

enter image description here

如上例所示,我的盒子的宽度在不同的 x 处出现不同的情况。值,因为我没有 x 的所有可能组合和 fill值,所以。

我希望所有的盒子都具有相同的宽度。可以这样做吗(理想情况下不操作底层数据框,因为我担心添加虚假数据会在进一步分析过程中引起我的困惑)?

我的第一个想法是
+ geom_boxplot(width=0.5)

但这无济于事;它调整给定 x 的全套箱线图的宽度因素水平。

This post几乎似乎相关,但我不太明白如何将其应用于我的情况。使用 + scale_fill_discrete(drop=FALSE)似乎没有改变条的宽度。

最佳答案

问题是由于某些因子组合单元格不存在。 cyl 的所有水平组合的数据点数和 drv可以通过xtabs查询:

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

创建三个假行(-1 作为 cty 的值):
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

关于r - 强制箱线图从 geom_boxplot 到恒定宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com