2013-08-25 73 views
4

如何使用ggplot在多個條形圖上確定它們之間的條形和空格寬度,每個圖形上的條形數量不同?ggplot條形圖中的等寬

這是一個失敗的嘗試:

m <- data.frame(x=1:10,y=runif(10)) 
ggplot(m, aes(x,y)) + geom_bar(stat="identity") 

enter image description here

ggplot(m[1:3,], aes(x,y)) + geom_bar(stat="identity") 

enter image description here

添加width=1geom_bar(...)沒有很好的幫助。我需要第二個圖自動減少寬度和相同的寬度和空間作爲第一個。

回答

4

編輯:

看樣子OP只是希望這樣的:

library(gridExtra) 
grid.arrange(p1,arrangeGrob(p2,widths=c(1,2),ncol=2), ncol=1) 

我不知道,如果可能的話絕對寬度傳遞給geom_bar。所以,這裏是一個醜陋的黑客:

set.seed(42) 
m <- data.frame(x=1:10,y=runif(10)) 
p1 <- ggplot(m, aes(x,y)) + geom_bar(stat="identity") 
p2 <- ggplot(m[1:3,], aes(x,y)) + geom_bar(stat="identity") 
g1 <- ggplotGrob(p1) 
g2 <- ggplotGrob(p2) 

我用str找到正確的grob和孩子。如有必要,您可以使用更復雜的方法來推廣這一點。

#store the old widths 
old.unit <- g2$grobs[[4]]$children[[2]]$width[[1]] 

#change the widths 
g2$grobs[[4]]$children[[2]]$width <- rep(g1$grobs[[4]]$children[[2]]$width[[1]], 
             length(g2$grobs[[4]]$children[[2]]$width)) 

#copy the attributes (units) 
attributes(g2$grobs[[4]]$children[[2]]$width) <- attributes(g1$grobs[[4]]$children[[2]]$width) 

#position adjustment (why are the bars justified left???) 
d <- (old.unit-g2$grobs[[4]]$children[[2]]$width[[1]])/2 
attributes(d) <- attributes(g2$grobs[[4]]$children[[2]]$x) 
g2$grobs[[4]]$children[[2]]$x <- g2$grobs[[4]]$children[[2]]$x+d 

#plot 
grid.arrange(g1,g2) 

enter image description here

+0

謝謝,有沒有反正只是爲了縮小圖的寬度 - 使酒吧的寬度和空間不變? – Ali

+0

我不完全確定你想要達到什麼。也許調整比例限制? – Roland

+0

我已經更新了這個問題。我需要酒吧寬度和酒吧之間的空格是相同的兩個情節(所以第二個情節的寬度約爲自動第一.3)。如何調整規模限制可以幫助我實現目標?你有個例子嗎? – Ali

0

裹在僅需要一個單一的圖表的功能的其他建議。

fixedWidth <- function(graph, width=0.1) { 
    g2 <- graph 

    #store the old widths 
    old.unit <- g2$grobs[[4]]$children[[2]]$width[[1]] 
    original.attibutes <- attributes(g2$grobs[[4]]$children[[2]]$width) 

    #change the widths 
    g2$grobs[[4]]$children[[2]]$width <- rep(width, 
              length(g2$grobs[[4]]$children[[2]]$width)) 

    #copy the attributes (units) 
    attributes(g2$grobs[[4]]$children[[2]]$width) <- original.attibutes 

    #position adjustment (why are the bars justified left???) 
    d <- (old.unit-g2$grobs[[4]]$children[[2]]$width[[1]])/2 
    attributes(d) <- attributes(g2$grobs[[4]]$children[[2]]$x) 
    g2$grobs[[4]]$children[[2]]$x <- g2$grobs[[4]]$children[[2]]$x+d 

    return(g2) 
}