我目前正在使用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))
这给出了以下输出:
基本上,我希望底部图形仅与顶部图形的a和b段一样宽,从而使两个图形中的每个条形图都具有相同的绝对宽度。请注意,我的图表将单独绘制,而不是作为网格的一部分。
我尝试使用coord_fixed()
播放宽高比,但由于y轴具有不同的范围,因此我无法使用每个图形的一致值。调整width
的实际geom_boxplot
会改变各个框的相对宽度,而不是它们的绝对宽度。
我可以使用scale_x_discrete
将解决方案用于ggplot2 scale_x_continuous limits or absolute,但之后我必须裁剪第二张图片。
我还尝试调整其他问题的解决方案,例如Setting absolute size of facets in ggplot2,GGPLOT2: Distance of discrete values of from each end of x-axis和Formatting positions on discrete scale in ggplot2,但到目前为止还没有任何问题。
任何帮助将不胜感激!
编辑以回应@ tonytonov的回答
如上所述调整scale_x_discrete
,并在@ tonytonov的答案中,得到如下图表:
但是,我想在底部得到以下图表(我使用Inkscape裁剪下图):
如上所述,我只是在网格中绘制图形,以表明我希望y轴的绝对长度和绝对 x步长为是相同的。
再次感谢!
答案 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)
如果你有很多情节,你可以通过预先计算最长的水平来获得更通用的解决方案。这种方法可以很容易地包含在一个便利函数中。
编辑:
我能做的最好的模仿所需的情节是(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:)