2015-10-06 210 views
4

我目前使用ggplot2创建了几个箱形图。每个方块图都显示相似的数据,但离散x轴的范围以及连续的y轴并不总是相同。一些盒子图只有两个离散的x值,其他的有三个或五个。另外,连续的y轴具有非常不同的范围;一些范围从0-80,其他从0-2.5。ggplot2:设置每个离散x点的绝对距离

理想情况下,我想得到以下输出:每图中,所有的y轴的应该是相同的绝对长度,并且每一个离散的“步骤”沿x轴应该是相同的绝对长度也是如此。

library(ggplot2) 
library(grid) 
x1 <- factor(c('a','b','c','d','e')) 
y1 <- c(10,20,50,60,80) 
df1 <- data.frame(x1,y1) 

x2 <- factor(c('a','b')) 
y2 <- c(2,3.5) 
df2 <- data.frame(x2,y2) 

g1 <- ggplot(df1, aes(x = x1, y = y1)) + 
    geom_bar(stat='identity') 

g2 <- ggplot(df2, aes(x=x2,y=y2)) + 
    geom_bar(stat='identity') 

grid.newpage() 
pushViewport(viewport(layout = grid.layout(2, 1))) 
print(g1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))   
print(g2, vp = viewport(layout.pos.row = 2, layout.pos.col = 1)) 

这让下面的输出:

我已经用柱状图代替箱线图,显示问题创造了一个简单的例子

enter image description here

基本上,我想底部图仅与顶部图的a和b部分一样宽,从而使得两个图中的每个条相同的宽度为绝对宽度。请注意,我的图形将单独绘制,而不是网格的一部分。

我试过使用coord_fixed()来玩纵横比,但是由于y轴有这样的不同范围,所以没有一个一致的值可以用于每个图形。调整geom_boxplot的实际width会改变各个框的相对宽度,而不是其绝对宽度。

我可能会使用解决方案ggplot2 scale_x_continuous limits or absolute使用scale_x_discrete,但我必须裁剪第二个图像。

我也尝试调整其他问题的解决方案,如Setting absolute size of facets in ggplot2,GGPLOT2: Distance of discrete values of from each end of x-axisFormatting positions on discrete scale in ggplot2,但目前还没有任何工作。

任何帮助将不胜感激!

编辑回应@ tonytonov的回答

调整scale_x_discrete正如我上面提到的,并在下面@ tonytonov的答案,结果如下图:

enter image description here

不过,我想喜欢刚刚得到下面的图(我用Inkscape剪下图):

enter image description here

如上所述,我只是绘制在网格图形显示我想在y轴和绝对 X步长的绝对长度是相同的。

再次感谢!

回答

1

您可以“还原”缺失类别加入scale_x_discrete(limits =),或者,甚至更短,

g2 + xlim(levels(df1$x1)) 

不要这样的任务使用pushViewport:看看如何可以用gridExtra完成。

library(gridExtra) 
grid.arrange(g1, g2 + xlim(levels(df1$x1)), nrow = 2) 

enter image description here

如果你有许多情节,你必须通过事先搞清楚最长的水平更通用的解决方案。这种方法可以很容易地包装到一个方便的功能中。

编辑:

我可以做模仿所希望的描绘是最好的(rectGrob是像个假人占位符)

grid.arrange(g1, g2, rectGrob(width = NA), 
      layout_matrix = rbind(c(1,1,1,1,1), c(2,2,3,3,3))) 

当然,没有x轴的对准,但它是一种常见的问题(请检查此wiki以了解可能的解决方案)。另一种选择是等待@baptiste :)

enter image description here

+0

谢谢您的回答!这个解决方案就是我在上面的问题中调整'scale_x_discrete'的意思。因为我不需要空的类别,有没有办法保持酒吧的宽度等,而不必在另一个程序中裁剪情节?我可以很容易地做到这一点,如果我不必为每张图都做到这一点,它会为我节省很多时间。也非常感谢'gridExtra'提示! – MSJ

+0

啊,我明白了,那是一个不同的故事。我会看看,但我不指望它会很容易。 – tonytonov

+0

这可能有所帮助:https://github.com/baptiste/gridextra/wiki/arrange-ggplot – tonytonov