如何重塑数据以在R中创建多个变量的箱形图的构面

时间:2018-12-29 16:58:18

标签: r ggplot2 boxplot facet

我想为数据创建多个箱形图,以说明各种条件下每种化学物质的含量。

我有两个类别变量M1和M2,它们分别取值“小,中,大”和“低,中,高”。我希望这些构成3x3构面网格的基础。

然后我有8种化学药品A-H,它们取一个数值,我想为每个面上的每种化学药品提供箱线图。

我制作了一个3x3的小平面网格,但每个网格上都只有一种化学物质。

编辑(数据取自答案)我的数据看起来像是从以下位置生成的数据:

set.seed(1234)

n <- 100
M1 <- sample( c("small", "medium", "large"), n, TRUE)
M2 <- sample( c("low", "medium", "high"), n, TRUE)
tmp <- matrix(sample(100, 8*n, TRUE), ncol = 8)
colnames(tmp) <- LETTERS[1:8]

df <- data.frame(M1, M2)
df <- cbind(df, tmp)
rm(M1, M2, tmp)

我的情节代码:

df %>%
  ggplot(aes(x = M1, y = A, fill = M1)) +
  geom_boxplot() +
  theme_minimal() +
  facet_grid(M2 ~ M1)

我认为我需要重塑数据,以便在进行多面箱线图绘制之前y ='measure',但是我不确定如何做

我想要一个3x3的刻面网格,这样左下角将对应于“小”,“低”,右上角将对应于“大”,“高”,每个面上的8个箱形图分别对应化学药品AH。

我希望每个面的y轴都是数字量度,x轴是离散标签A-H(用于8个箱形图)。对于整个3x3网格,(顶部)x轴将分别是小,中,大3个标签,而y轴(右侧)将是低,中,高3个标签?

1 个答案:

答案 0 :(得分:1)

使用软件包reshape2,函数melt重塑数据。然后使用interaction定义框组。

long <- reshape2::melt(df, id.vars = c("M1", "M2"))

ggplot(long, aes(x = M1, y = value, group = interaction(M1, M2), fill = M2)) +
  geom_boxplot() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
  facet_wrap( ~ variable, scales = "free")

enter image description here

要回答评论中的请求,请查看这是否是您的意思。

ggplot(long, aes(x = variable, y = value, group = interaction(M1, variable), fill = M2)) +
  geom_boxplot() +
  facet_grid(M1 ~ M2, scales = "free")

enter image description here

测试数据创建代码。

我已强迫M2进行分解,以使图例正确排序。

set.seed(1234)

n <- 100
M1 <- sample( c("small", "medium", "large"), n, TRUE)
M2 <- sample( c("low", "medium", "high"), n, TRUE)
M2 <- factor(M2, levels = c("low", "medium", "high"))
tmp <- matrix(sample(100, 8*n, TRUE), ncol = 8)
colnames(tmp) <- LETTERS[1:8]

df <- data.frame(M1, M2)
df <- cbind(df, tmp)
rm(M1, M2, tmp)