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

MSJ*_*MSJ 5 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))
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

在此输入图像描述

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

我尝试使用 来调整纵横比coord_fixed(),但由于 y 轴的范围如此不同,因此我无法为每个图表使用一致的值。调整实际widthgeom_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 步长相同。

再次感谢!

ton*_*nov 1

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:)

在此输入图像描述