不均匀类别上的小平面条形图

facet barplot on uneven category

这是一个示例 data.frame,它有 30 个唯一样本(ID 1 到 30),每个样本有三个测量值(在三个不同的阈值('G1' 列);5e-03, 5e-05、5e-08)。 90 个观测值中的每一个都有一个 p 值(P 列)。最后,三十个样本中的每一个都可以属于十个不同类别之一('G2')[抱歉所有数字变量!]

 # example data.frame
df <- data.frame(
  'ID' = as.character(unlist(lapply(seq(1:30), function(x) rep(x,3)))),
  'P'  = runif(n = 90, min = 0, max = 1),
  'G1' = as.character(c('5e-03','5e-05','5e-08')),
  'G2' = as.character(unlist(lapply(sample(1:10, size = 30, replace = T), function(x) rep(x,3))))
)

我可以使用此命令生成漂亮的条形图;

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) +
  geom_bar(stat = 'identity') +
  coord_flip() +
  facet_grid(. ~ G1)

看起来像这样:

Plot 1: image with one facet, and 'G2' visualised using colour

然而,我真正想做的是有两个方面; 'G1' 在列上(目前如此),而不是使用条形颜色来划分 'G2' 变量,我想要 G2 上的第二个水平面。这是我试过的:

ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) +
  geom_bar(stat = 'identity') +
  coord_flip() +
  facet_grid(G2 ~ G1)

这是不对的。当我在 G2 上分面时,它在每个分面上绘制 all 个样本。这很难看,因为每个样本只能属于一个 G2 类别。如何生成第二个方面,其中仅绘制属于该组的条形图?我尝试调整 'drop'、'scale' 和 'space' 变量 facet_grid,但它并没有改善。

This 是我要找的东西——我已经在应该位于构面的绘图部分上手动绘制了矩形。它与图 1 基本相同,只是条形图被拆分为 G2 小平面。

首先请注意,由于您正在与 G2 和 G1 进行分面,因此您不再需要 x=interaction(ID,G2)x=ID 就足够了。

默认情况下,绘图的所有方面在其 x 轴和 y 轴上共享相同的比例。但是您可以使用 scales 参数

来更改它
ggplot(df, aes(x = ID, y = P, fill = G2)) +
  geom_bar(stat = 'identity') +
  facet_grid(G1 ~ G2, scales="free_x")

请注意,我在网格定义中交换了 G1 和 G2。不过,我不认为它可以与 coord_flip() 一起使用。

只是添加到 Pierre 的回答中:

ggplot(df, aes(x = ID, y = P, fill = G2)) +
  geom_bar(stat = 'identity') +
  facet_grid(G1 ~ G2, scales="free", space="free") 

这将为每个栏提供相同的宽度。