2016-11-28 76 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