在ggplot2中混合facet_grid()和facet_wrap()

时间:2014-02-26 12:52:22

标签: r ggplot2

我的问题有点奇怪。我有四种方法(M1,M2,M3和M4),每种方法都在两个独立的阶段(T1和T2)和10种不同的尺寸(1,2,......,10)进行了实验。下表显示了数据的结构:

phase size  mean      stdev   method
T1    1     0.005     0.001    M1
T1    2     0.009     0.004    M1
T1    3     0.011     0.004    M1
...
T2    9     269.020   12.003   M4
T2    10    297.024   10.004   M4

第一阶段结果(T1)的范围小于第二阶段的范围。以下命令生成第一个图

p <- ggplot(ds, aes(x=size, y=mean, color=method)) 
      + geom_line() 
      + geom_smooth(aes(ymin=mean-stdev, ymax=mean+stdev), stat="identity") 
      + scale_x_discrete(breaks=1:10) 
      + labs(x="Size", y="Time in Seconds", fill="Method") 
      + theme(panel.margin=unit(0.5, "lines"), legend.position="none") 
      + facet_grid(method~phase, scales="free_y")

结果: The use of facet_grid()
虽然以下代码给出了第二个数字

p <- ggplot(ds, aes(x=size, y=mean, color=method))
      + geom_line() 
      + geom_smooth(aes(ymin=mean-stdev, ymax=mean+stdev), stat="identity") 
      + scale_x_discrete(breaks=1:10) 
      + labs(x="Size", y="Time in Seconds", fill="Method") 
      + theme(panel.margin=unit(0.5, "lines"), legend.position="none") 
      + facet_wrap(method~phase, ncol=2, scales="free_y")

The use of facet_wrap()
现在,问题是“我如何使用facet_grid()并强制y轴是免费的,类似于使用facet_wrap()?”或“如何将facet_wrap()的标签更改为与facet_grid()相似?”
提前谢谢

1 个答案:

答案 0 :(得分:1)

编辑:对其他人的警告,OP正在使用但未包含的数据在低值时具有足够的动态范围,此答案将无效。

我认为你不能用facet_grid做你想做的事,但如果你愿意交换M和T,你可以在你的特定实现中非常接近:

ggplot(ds, aes(x=size, y=mean, color=method)) + geom_line() + 
  #geom_smooth(aes(ymin=mean-stdev, ymax=mean+stdev), stat="identity") + 
  scale_x_discrete(breaks=1:10) + 
  labs(x="Size", y="Time in Seconds", fill="Method") +
  theme(panel.margin=unit(0.5, "lines"), legend.position="none") + 
  facet_grid(phase~method, scales="free_y")

enter image description here

facet_grid中,Y刻度在行之间是自由的,但不是列,所以通过重新定向刻面,我们可以将高幅度和低幅度值分隔到行上,以便行方式释放具有期望的效果。