我目前正在使用创建几个箱线图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))
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
基本上,我希望底部图表的宽度与顶部图表的 a 和 b 段一样宽,从而使两个图表中的每个条形具有相同的绝对宽度。请注意,我的图表将单独绘制,而不是作为网格的一部分。
我尝试使用 来调整纵横比coord_fixed()
,但由于 y 轴的范围如此不同,因此我无法为每个图表使用一致的值。调整实际width
值geom_boxplot
会改变各个框的相对宽度,而不是它们的绝对宽度。
我可能会使用ggplot2 scale_x_continuous 限制或绝对的解决方案使用的解决方案scale_x_discrete
,但随后我必须裁剪第二张图像。
我还尝试调整其他问题的解决方案,例如设置 ggplot2 中的面的绝对大小、GGPLOT2: Distance of discrete value of from every end of x-axis,以及Formattingpositions on离散比例 in ggplot2,但没有一个有效远的。
任何帮助将不胜感激!
编辑回应@tonytonov的答案
按照我上面提到的以及下面 @tonytonov 的回答进行调整scale_x_discrete
,结果如下图:
但是,我只想获取下图的底部部分(我使用 Inkscape 裁剪下图):
如上所述,我只是在网格中绘制图形以表明我想要y 轴的绝对长度和绝对长度x 步长相同。
再次感谢!
scale_x_discrete(limits = )
您可以通过添加,或者甚至更短,来“恢复”丢失的类别,
g2 + xlim(levels(df1$x1))
Run Code Online (Sandbox Code Playgroud)
并且不要用于pushViewport
此类任务:看看如何使用gridExtra
.
library(gridExtra)
grid.arrange(g1, g2 + xlim(levels(df1$x1)), nrow = 2)
Run Code Online (Sandbox Code Playgroud)
如果您有很多图,您可以通过预先计算最长的级别来获得更通用的解决方案。然后可以轻松地将这种方法包装到便利函数中。
编辑:
我能做的最好的事情就是模仿所需的情节(rectGrob
就像一个虚拟占位符一样)
grid.arrange(g1, g2, rectGrob(width = NA),
layout_matrix = rbind(c(1,1,1,1,1), c(2,2,3,3,3)))
Run Code Online (Sandbox Code Playgroud)
当然,没有 x 轴对齐,但这是一个常见问题(查看此wiki以获取可能的解决方案)。另一种选择是等待@baptiste:)