在连续 x 轴上按组填充和闪避箱线图

Posted

技术标签:

【中文标题】在连续 x 轴上按组填充和闪避箱线图【英文标题】:Fill and dodge boxplots by group on a continuous x axis 【发布时间】:2017-12-19 10:32:03 【问题描述】:

我一直对似乎很简单的事情有疑问:具有连续 x 轴的分组箱线图。

这里是最小数据数据:

df <- cbind(expand.grid(x=1:10, rep=1:20, fill=c("A", "B")), y=runif(400))

这就是我想要的;你会看到我已经强制 x 轴是离散的:

ggplot(df, aes(x=as.factor(x), y=y,  fill=fill)) + geom_boxplot()

这是当我将x 保留为连续的,没有分组时得到的:

ggplot(df, aes(x=x, y=y,  fill=fill)) + geom_boxplot()

当我添加分组时,颜色消失:

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

要明确的是,我想要的 geom_point 是:

ggplot(df, aes(x=x, y=y, group=x, color=fill)) + geom_point(position=position_dodge(width=.7))

...但是如果我尝试在箱线图中设置闪避:

ggplot(df, aes(x=x, y=y, color=fill)) + geom_boxplot(position=position_dodge(width=.7))

有什么建议吗?我试过四处搜索:this question 解决了连续箱线图,但没有着色问题; this question 让我想知道是否需要设置交互,但似乎没有得到想要的结果。任何帮助将不胜感激!

【问题讨论】:

我知道这不是您所要求的,但您可以在x 上按间隔进行分组(取决于数据是否有效)。 ggplot(df, aes(x=cut_interval(x=x, length=1), y=y, fill=fill)) + geom_boxplot() 【参考方案1】:

这是一个可行的版本,为您自己的切割尺寸定制

取原df:

df <- cbind(expand.grid(x=1:10, rep=1:20, fill=c("A", "B")), y=runif(400))

使用 cut() 来定义您想要 x 组的位置,并使用“dodge2”来定位您的图表:

ggplot(df, aes(x = cut(x, 5), y = y, fill = fill)) +
        geom_boxplot(position = "dodge2", outlier.alpha = 0.1)

具有 5 个自定义组的箱线图,在 1:10 之间等切

【讨论】:

【参考方案2】:

来自?aes_group_order

默认情况下,组被设置为所有离散变量的交互 情节。

在您的数据中,您只有一个离散变量“填充”。然而,我们希望数据按 both "fill" "x" 分组。因此,我们需要使用 group 参数指定所需的分组。是的,你是对的,interaction 是正确的选择。

首先,一个稍微小一点的数据集(更容易将数据链接到输出):

d <- data.frame(x = rep(c(1, 2, 4), each = 8),
                grp = rep(c("a", "b"), each = 4),
                y = sample(24))

然后是绘图,我们按“x”和“grp”(interaction(x, grp))的不同组合对数据进行分组,fill 将框按“grp”分组:

ggplot(d, aes(x = x, y = y, group = interaction(x, grp), fill = grp)) +
  geom_boxplot()

【讨论】:

以上是关于在连续 x 轴上按组填充和闪避箱线图的主要内容,如果未能解决你的问题,请参考以下文章

如何在ggplot的箱线图中按组绘制平均值

在箱线图中的 y 轴上添加中断

根据中值对箱线图进行排序

箱线图放置在时间轴上

来自python中值表的箱线图

Matplotlib 箱线图 x 轴