gpt4 book ai didi

r - 用新浪图显示多个因素

转载 作者:行者123 更新时间:2023-12-04 10:46:22 24 4
gpt4 key购买 nike

注意:我有 更新 这篇文章是在与 Z. Lin 讨论之后发布的。最初,我已将我的问题简化为双因素设计(参见“ 原始问题 ”部分)。但是,我的实际数据由四个因素组成,需要 facet_grid。因此,我在下面提供了一个四因素设计的例子(参见“ 编辑”部分)。

原问题

假设我有一个双因子设计,dv 作为我的因变量,iv.x 和 iv.y 作为我的因子/自变量。一些快速示例数据:

DF <- data.frame(dv = rnorm(900), 
iv.x = sort(rep(letters[1:3], 300)),
iv.y = rep(sort(rep(rev(letters)[1:3], 100)), 3))

我的目标是分别显示每个条件,因为 fiddle 图可以很好地完成:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_violin()  

我最近遇到了新浪的阴谋,并想在这里做同样的事情。不幸的是,新浪图没有这样做,而是折叠数据。
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina()

显式调用 position dodge 也无济于事,因为这会产生错误消息:
ggplot(DF, aes(iv.x, dv, colour=iv.y)) + geom_sina(position = position_dodge(width = 0.5))

新浪图的作者在 2016 年就已经意识到了这个问题:
https://github.com/thomasp85/ggforce/issues/47

我的问题更多是在时间方面。我们很快想提交一份手稿,新浪图将是展示我们数据的好方法。谁能想到新浪图的解决方法,这样我仍然可以像上面的 fiddle 图示例一样显示两个因素?

编辑

四因子设计的样本数据:
    DF <- data.frame(dv=rnorm(400), 
iv.w=sort(rep(letters[1:2],200)),
iv.x=rep(sort(rep(letters[3:4],100)), 2),
iv.y=rep(sort(rep(rev(letters)[1:2],50)),4),
iv.z=rep(sort(rep(letters[5:6],25)),8))

我想使用新浪图创建的 fiddle 图示例:
    ggplot(DF, aes(iv.x, dv, colour=iv.y)) + 
facet_grid(iv.w ~ iv.z) +
geom_violin(aes(y = dv, fill = iv.y),
position = position_dodge(width = 1))+
stat_summary(aes(y = dv, fill = iv.y), fun.y=mean, geom="point",
colour="black", show.legend = FALSE, size=.2,
position=position_dodge(width=1))+
stat_summary(aes(y = dv, fill = iv.y), fun.data=mean_cl_normal, geom="errorbar",
position=position_dodge(width=1), width=.2, show.legend = FALSE,
colour="black", size=.2)

最佳答案

编辑解决方案 ,因为 OP 澄清了需要方面:

ggplot(DF, aes(x = interaction(iv.y, iv.x), 
y = dv, fill = iv.y, colour = iv.y)) +
facet_grid(iv.w ~ iv.z) +
geom_sina() +
stat_summary(fun.y=mean, geom="point",
colour="black", show.legend = FALSE, size=.2,
position=position_dodge(width=1))+
stat_summary(fun.data=mean_cl_normal, geom="errorbar",
position=position_dodge(width=1), width=.2,
show.legend = FALSE,
colour="black", size=.2) +
scale_x_discrete(name = "iv.x",
labels = c("c", "", "d", "")) +
theme(panel.grid.major.x = element_blank(),
axis.text.x = element_text(hjust = -4),
axis.ticks.x = element_blank())

这种方法不是使用刻面来模拟颜色之间的闪避,而是创建了一个新变量 interaction(colour.variable, x.variable)映射到 x 轴。

其余代码在 scale_x_discrete() & theme()是否隐藏默认的 x 轴标签/刻度线/网格线。
axis.text.x = element_text(hjust = -4)是一种将 x 轴标签移动到 的 hack大约 正确的位置。这很丑陋,但考虑到用例是用于提交手稿,我认为图的大小将是固定的,您只需要调整一次即可。

edited solution

原解决方案 :

假设您的图不需要分面,您可以使用分面模拟外观:
ggplot(DF, aes(x = iv.y, y = dv, colour = iv.y)) +
geom_sina() +
facet_grid(~iv.x, switch = "x") +
labs(x = "iv.x") +
theme(axis.text.x = element_blank(), # hide iv.y labels
axis.ticks.x = element_blank(), # hide iv.y ticks
strip.background = element_blank(), # make facet strip background transparent
panel.spacing.x = unit(0, "mm")) # remove horizontal space between facets

plot

关于r - 用新浪图显示多个因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50410085/

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