ggplot2:设置每个离散x点的绝对距离

时间:2015-10-06 17:34:30

标签: r ggplot2

我目前正在使用ggplot2创建多个箱形图。每个箱形图都显示相似的数据,但离散x轴的范围以及连续的y轴并不总是相同。有些箱形图只有两个离散的x值,其他有三个或五个。此外,连续的y轴具有非常不同的范围;一些范围从0到80,其他范围从0到2.5。

理想情况下,我想获得以下输出:对于每个图形,所有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轴具有不同的范围,因此我无法使用每个图形的一致值。调整width的实际geom_boxplot会改变各个框的相对宽度,而不是它们的绝对宽度。

我可以使用scale_x_discrete将解决方案用于ggplot2 scale_x_continuous limits or absolute,但之后我必须裁剪第二张图片。

我还尝试调整其他问题的解决方案,例如Setting absolute size of facets in ggplot2GGPLOT2: 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 个答案:

答案 0 :(得分:1)

你可以恢复&#34;通过添加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