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

R ggplot2:设置每个离散x点的绝对距离,r,ggplot2,R,Ggplot2,我目前正在使用ggplot2创建几个方框图。每个方框图显示相似的数据,但离散x轴和连续y轴的范围并不总是相同的。一些长方体图只有两个离散的x值,其他的只有三个或五个。此外,连续y轴具有非常不同的范围;有些在0-80之间,有些在0-2.5之间 理想情况下,我希望得到以下输出:对于每个图形,所有y轴都应具有相同的绝对长度,沿x轴的每个离散“步长”也应具有相同的绝对长度 我创建了一个简单的示例,使用条形图而不是方框图来显示问题: library(ggplot2) library(grid) x1 &l

我目前正在使用
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))
库(ggplot2)
图书馆(网格)
x1您可以通过添加
scale\u x\u discrete(limits=)
或更短的

g2 + xlim(levels(df1$x1))
不要使用
pushViewport
执行此类任务:看看如何使用
gridExtra
完成此任务

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

如果你有很多图,你将有一个更一般的解决方案,通过计算最长的水平事先。这种方法可以很容易地包装成一个方便的函数

编辑:

我能做的最好的模拟所需的绘图是(
rectGrob
像一个虚拟占位符)

当然,没有x轴对齐,但这是一个常见问题(请检查此项以获得可能的解决方案)。另一个选项是等待@baptiste:)


谢谢您的回答!这个解决方案就是我在上面的问题中调整
scale\x\u discrete
的意思。由于我不需要空的类别,有没有一种方法可以在不需要在不同的程序中裁剪绘图的情况下保持条形图的宽度等?我可以很容易地做到这一点,如果我不必对每个图表都这样做的话,这将节省我很多时间。也非常感谢您提供的
gridExtra
提示!啊,我明白了,那就不同了。我会看一看,不过我不认为这会那么容易。
grid.arrange(g1, g2, rectGrob(width = NA), 
             layout_matrix = rbind(c(1,1,1,1,1), c(2,2,3,3,3)))