2016-11-15 67 views
3

下面是一个包含30个独特样本(ID 1到30)的示例数据框,每个样本有三个测量(在三个不同的阈值('G1'列); 5e-03,5e -05,5e-08)。 90个观测值中的每一个都有一个p值(P列)。最后,每个三十样本可以属于十个不同类别之一(“G2”)凹凸类别上的方面barplot

# 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时,它在每个方面绘制全部个样本。这很难看,因为每个样本只能属于一个G2类别。如何生成仅包含属于该组的柱的第二个方面?我曾尝试调整facet_grid中的'drop','scale'和'space'变量,但它并没有改进。

This是我正在寻找 - 我已经手动绘制应该在方面的阴谋部分的矩形。它基本上与曲线1相同,除了条被分成G2曲面。

+0

你为什么要加coord_flip()?删除它并再次运行相同的代码。我想这就是你要找的 –

+0

感谢您的答复。删除coord_flip()并不能解决问题,但G2方面仍在绘制未观察到的数据。我正在使用coord_flip(),因为我希望整个页面上的情节出于审美原因。 – mbyvcm

+0

也许改变互动来粘贴? '粘贴(ID,G2,sep =“。”)' – zx8754

回答

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()一起工作。

+0

谢谢皮埃尔!你几乎解决了它,非常感谢!有没有什么办法让所有单独的酒吧有相同的宽度?你的解决方案会导致一些酒吧延伸填补方面。 – mbyvcm

1

只是增加了皮埃尔答案:

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

这将给予相同的宽度为每一个酒吧。

+0

非常好的库马尔!这是一个耻辱,没有办法与coord_flip()一起做到这一点。但我可以忍受这一点! – mbyvcm