这是一个示例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
然而,我真正想做的是有两个方面; &#39; G1&#39;在列(当前是)上,而不是使用条形颜色来划分&#39; G2&#39;变量,我想在G2上第二个水平面。这就是我的尝试:
ggplot(df, aes(x = interaction(ID,G2), y = P, fill = G2)) +
geom_bar(stat = 'identity') +
coord_flip() +
facet_grid(G2 ~ G1)
这是不对的。当我面对G2时,它会在每个方面绘制所有样本。这很难看,因为每个样本只能属于一个G2类别。如何生成仅绘制属于该组的条形的第二个方面?我已经尝试过调整&#39; drop&#39;&#39; scale&#39;和&#39;空间&#39; facet_grid中的变量,但它并没有改进。
我正在寻找This - 我在绘图中应该在方面的部分手动绘制矩形。它与Plot 1基本相同,只是条形被分成G2面。
答案 0 :(得分:2)
首先请注意,由于您正在使用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()
一起使用。
答案 1 :(得分:1)
刚刚加入皮埃尔回答:
ggplot(df, aes(x = ID, y = P, fill = G2)) +
geom_bar(stat = 'identity') +
facet_grid(G1 ~ G2, scales="free", space="free")
这将为每个条形图提供相同的宽度。