r - 如何在具有多个组/条件的箱图中更改一个箱线图的宽度?
问题描述
我是 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 时间点的数据,所以最右边的框的外观要大得多。我似乎无法弄清楚如何在不改变其余部分的情况下改变这个盒子的宽度。
解决方案
这应该可以帮助你。首先,让我使用一个示例数据集和一个示例箱线图:
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'))
推荐阅读
- flutter - 在 appbar 上更新时,Flutter 脚手架更新了整个页面
- c# - '无法将'System.String'类型的对象转换为'System.Windows.Controls.ComboBoxItem
- r - 是否有可以梳理 .csv 文件并将该电子表格中列出的选定文件移动到新文件夹的 R 函数?
- codeigniter - Community-auth Codeigniter 3 - 随机似乎丢失会话变量
- c++ - ADL 未找到模板化的自由函数
- ruby-on-rails - 部分可以是特定于控制器的吗?
- python - Python/Tkinter - 如何创建一个窗口的无限副本?
- ios - UITableViewRowAction 动作在滑动而不是点击时触发
- reactjs - 在一对多关系中,有没有办法通过子属性过滤父对象?
- symfony - 教义 findOneBy(),外键值为空