2016-11-28 79 views
0

我有几个数据集共享相同的x轴,但其y轴相差几个数量级。出于这个原因,y轴上的标签具有不同的尺寸,当使用ggplot绘图时,x轴变得不对齐。为了使我的绘图具有可比性,我希望所有x轴在最终的绘图中具有相同的长度。这是一个相当简单的程序,其中facetting and grids can be used()。但是,此过程意味着汇总所有图并将它们发送到相同的png或eps文件。我有几个原因(超出了这篇文章的范围)把每个小区存储在它自己的png中。因此,为了保持图的可比性,我必须找到一种方法来强制它们在图像的左边界和标记y轴的线之间具有相同的空间。左对齐独立图的y标签(ggplot)

我的猜测是用空格“填充”标签以使它们都具有相同数量的字符将解决问题,但它没有解决问题。我也尝试改变point.margin无济于事。有人知道如何做到这一点?

library(stringr) 
library(ggplot2) 
y1 <- seq(1,100,by=1) 
y2 <- seq(1,1000000,by=10000) 
x <- seq(1,100,by=1) 
data <- data.frame(x,y1,y2) 

m1 <- ggplot(data=data,aes(x=x,y=y1)) + geom_line() + 
     scale_y_continuous(labels=function(label) str_pad(label,width=20,side="right")) 
m11 <- m1 + theme_bw() + theme(panel.border = element_blank(), panel.grid.major= element_blank(), panel.grid.minor= element_blank(),axis.line=element_line(colour="black"),axis.text.x=element_text(size=12),axis.text.y=element_text(size=12)) 
m2 <- ggplot(data=data,aes(x=x,y=y2)) + geom_line() + 
     scale_y_continuous(labels=function(label) str_pad(label,width=20,side="right")) 
m21 <- m2 + theme_bw() + theme(panel.border = element_blank(), panel.grid.major= element_blank(), panel.grid.minor= element_blank(),axis.line=element_line(colour="black"),axis.text.x=element_text(size=12),axis.text.y=element_text(size=12)) 

png("m1.png") 
    m11 
dev.off() 
png("m2.png") 
    m21 
dev.off() 

enter image description here enter image description here

编辑: Baptise methods

+0

尝试搜索['set_panel_size'(http://stackoverflow.com/questions/32580946/setting-absolute-size-of-facets-in-ggplot2) – baptiste

+0

@ baptiste我尝试了你的建议,但没有成功。检查上面的编辑。 – j91

回答

0

我发现,似乎ADRESS解决问题的办法。

首先,将ggplot对象转换为gtables。

g1 <- ggplot_gtable(ggplot_build(m11)) 
g2 <- ggplot_gtable(ggplot_build(m21)) 

然后,找到最大的宽度并使用它来替换其余图中的宽度。

maxWidth = unit.pmax(g1$widths[2:3], g2$widths[2:3]) 
g1$widths[2:3] <- maxWidth 
g2$widths[2:3] <- maxWidth 

最后,使用grid.draw打印您的图到你的PNG设备。

png("m1.png") 
grid.draw(g1) 
dev.off() 

png("m2.png") 
grid.draw(g2) 
dev.off() 

enter image description here enter image description here