首页 > 解决方案 > 如何在具有多个组/条件的箱图中更改一个箱线图的宽度?

问题描述

我是 R 的初学者,并试图制作一个箱线图,显示某种产品在不同时间点在两种不同条件下的肿瘤积累。我想出了以下图像:

具有多组 + 条件的箱线图

我使用了这段代码:

ggplot(tumor, aes(x=time_point, y=IA, fill=condition)) + ggtitle ("Tumor accumulation") + xlab("Time post-injection (h)") + ylab("%IA/kg") + geom_boxplot()+ geom_point(position=position_jitterdodge(0))+ scale_x_discrete(limits=c("2", "24", "96", "144")) + scale_fill_brewer(palette="Paired") + theme_minimal() + expand_limits(y=0)

因为没有条件 C1 和 144 h 时间点的数据,所以最右边的框的外观要大得多。我似乎无法弄清楚如何在不改变其余部分的情况下改变这个盒子的宽度。

标签: rggplot2widthboxplot

解决方案


这应该可以帮助你。首先,让我使用一个示例数据集和一个示例箱线图:

df <- data.frame(
    samplename=c(rep("A", 10), rep("B1", 10), rep("B2", 10)),
    grp=c(rep("Group A", 10), rep("Group B", 20)),
    y=c(rnorm(10), rnorm(10, 0.2), rnorm(10, 0.35, 0.1))
)

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename))

在此处输入图像描述

这给你一个类似于你的例子的情节。左边的框被扩展以填充整个 x 美学,而右边的框被分割(官方术语是“躲避”),因此 B1 + B2 的总和 = B 的宽度。

要解决此问题,您可以使用preserve='single'函数中包含的参数,该参数position_dodge()必须应用于. 这就是我的意思:position=geom_boxpot

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename),
        position=position_dodge(preserve='single'))

在此处输入图像描述

这通过使所有单独的框(躲避或其他)具有相同的宽度来解决您的宽度问题,但这也意味着属于“A组”的框仍然向左躲避。这是一个问题,在通过添加position_dodge2()(电影字幕:“position_dodge 的回归!”)修复之前。只需将其替换为position_dodge()修复此问题,您就可以将所有框与其 x 轴值对齐:

ggplot(df, aes(grp, y)) +
    geom_boxplot(aes(fill=grp, group=samplename),
        position=position_dodge2(preserve='single'))

在此处输入图像描述


推荐阅读