在不均匀的类别上制作分面条形图

3
以下是一个示例数据框,其中有30个唯一样本(ID为1至30),每个样本都有三个测量值(在三个不同的阈值(“G1”列)下;5e-03、5e-05、5e-08)。每个观测值都有一个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)

展示如下:

图1:使用颜色可视化'G2'的单个面板图像

不过,我真正希望实现的是双面板;列上的'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上进行面孔时,它会在每个面孔中绘制所有样本。这很丑陋,因为每个样本只能属于一个G2类别。如何生成第二个面孔,仅绘制属于该组的条形图?我尝试调整facet_grid中的“drop”,“scale”和“space”变量,但没有改善。

就是我要找的 - 我已经手动在图形的部分上画了矩形,应该在面孔中。它本质上与Plot 1相同,只是将条形图拆分为G2面孔。


为什么你加了coord_flip()函数?把它删掉,再运行一遍代码。我猜这就是你想要的。 - joel.wilson
谢谢回复。删除coord_flip()并不能解决问题,G2分面仍然绘制未观察到的数据。我使用coord_flip()是因为我想要跨页面绘制图形以美化效果。 - mbyvcm
也许将交互改为粘贴?paste(ID, G2, sep = ".") - zx8754
1
我无法想象你希望图表的样子。 - joel.wilson
谢谢,但这并没有解决问题。 - mbyvcm
显示剩余2条评论
2个回答

2
请注意,由于您正在使用G2和G1进行facetting,因此您不再需要x=interaction(ID,G2)x=ID就足够了。
默认情况下,绘图的所有facets共享其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!你已经基本解决了它,非常感谢!有没有办法让所有单独的条形图宽度相同?你的解决方案导致一些条形图拉伸以填充facet。 - mbyvcm

1
只是补充Pierre的答案:

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

这将为每个条形图提供相同的宽度。

非常好的Kumar!可惜不能与coord_flip()一起使用。但我可以接受这个! - mbyvcm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接