如何创建一个按一个连续变量和一个因子变量分组的复杂箱线图?

问题描述 投票:0回答:1

我想复制论文中的箱线图,如下所示: enter image description here

箱线图由一个连续变量(I - 在 x 轴上索引)和一个因子变量(方法 - 按颜色索引)分组。

这是我的重复,一切看起来都很好,但是箱线图组不是根据连续变量的值放置的: enter image description here

我的代码如下:

df5 <- data.frame(
  I = factor(rep(c(50, 100, 200, 400), each = dim(df1)[1])),
  rbind(df1, df2, df3, df4)
)
ggplot(df5, aes(x = I, y = Values*1e05, fill = Method)) +
  geom_boxplot() +
  scale_fill_manual(values = c("#E41A1C", "#377EB8", "#4DAF4A", "#FF7F00")) +
  labs(x = "I (Number of subjects)", y = expression(paste("MISE(", beta[1], "(s))(x", 10^-5, ")"))) +
  theme_minimal()

我不得不说,我需要将连续变量的类型更改为因子才能正确显示四组箱线图。但箱线图组现在是等距的(不是根据连续变量的值:50、100、200、400)。

您能给我一些关于如何处理这个问题的提示吗?谢谢!

您能给我一些关于如何处理这个问题的提示吗?谢谢!

r ggplot2 boxplot
1个回答
1
投票

问题是您映射到

x
又名
I
的变量是
factor
而不是
numeric
。因此,为了达到您想要的结果,请将
I
转换为
numeric
。此外,为了完成这项工作,您还必须明确映射
group
aes,以便箱线图仍然按
I
Method
分组。为此,我将
interaction(I, Method)
映射到
group

使用一些虚假的随机示例数据:

df1 <- df2 <- df3 <- df4 <- expand.grid(
  Method = letters[1:4],
  Values = seq(100)
) |>
  transform(Values = runif(400))

df5 <- data.frame(
  I = factor(rep(c(50, 100, 200, 400), each = dim(df1)[1])),
  rbind(df1, df2, df3, df4)
)

library(ggplot2)

df5$I <- as.numeric(as.character(df5$I))

ggplot(df5, aes(
  x = I, y = Values * 1e05,
  fill = Method,
  group = interaction(I, Method)
)) +
  geom_boxplot() +
  scale_fill_manual(
    values = c("#E41A1C", "#377EB8", "#4DAF4A", "#FF7F00")
  ) +
  labs(
    x = "I (Number of subjects)",
    y = expression(
      paste("MISE(", beta[1], "(s))(x", 10^-5, ")")
    )
  ) +
  theme_minimal()

© www.soinside.com 2019 - 2024. All rights reserved.