2016-07-05 106 views
2

這個問題浮現在腦海中,因爲我想做一個幻燈片的圖表來展示我正在嘗試構建的結構。這些情節都是正方形的,我想用這種方式來保持它們(軸的尺寸應該是相同的)。控制ggplot2的圖例位置,但不改變座標軸的比例

我可以做到這一點很容易,例如:

library(ggplot2) 
library(magrittr) 

dd <- data.frame(x = runif(100), y = runif(100), z = rexp(100)) 
dd %>% ggplot(aes(x = x, y = y)) 
dd %>% ggplot(aes(x = x, y = y)) + geom_point() 

你會注意到如何兩個地塊很好「對齊」,在這個意義上,如果我在同尺寸導出他們,我能看到點以類似幻燈片的方式添加。

然而,一個傳奇出現時,軸會變形以適應傳說在同尺寸:

dd %>% ggplot(aes(x = x, y = y)) + geom_point(aes(size = z))

有沒有辦法讓這些3個地塊在一個序列很好地對準,使得軸在所有3中都保持在同一個位置?

回答

2

這將繪製三個繪圖,使繪圖板保持相同的形狀和大小。我使用gtable函數。前兩個地塊沒有傳說。因此,我在他們的gtables中添加了一列,以便前兩個佈局與第三個佈局相同。然後我確保前兩個圖的列寬與第三個圖的寬度相同。

如果您還想讓軸具有相同的比例,請考慮將coord_fixed(ratio = 1)添加到每個圖中。

library(ggplot2) 
library(magrittr) 
library(gtable) 
library(grid) 

dd <- data.frame(x = runif(100), y = runif(100), z = rexp(100)) 

# Get the ggplots 
p1 = dd %>% ggplot(aes(x = x, y = y)) 
p2 = dd %>% ggplot(aes(x = x, y = y)) + geom_point() 
p3 = dd %>% ggplot(aes(x = x, y = y)) + geom_point(aes(size = z)) 

# Get the ggplot grobs 
g1 = ggplotGrob(p1) 
g2 = ggplotGrob(p2) 
g3 = ggplotGrob(p3) 

# Add a column to g1 and g2 (any width will do) 
g1 = gtable_add_cols(g1, unit(1, "mm")) 
g2 = gtable_add_cols(g2, unit(1, "mm")) 

# Set g1 and g2 widths to be equal to g3 widths 
g1$widths = g3$widths 
g2$widths = g3$widths 

# Draw them 
grid.newpage() 
grid.draw(g1) 
grid.draw(g2) 
grid.draw(g3) 
1

我沒有得到100%的確切解決方案。但我認爲它非常接近。我不知道如何確定圖例標籤的寬度。如果您發現如何做到這一點,則可以相應地調整邊距。對於這個解決方案,我與傳奇和情節利潤率打了一圈。

library(dplyr) 
library(ggplot2) 

dd <- data.frame(x = runif(100), y = runif(100), z = rexp(100)) 
dd %>% ggplot(aes(x = x, y = y)) + 
    theme(plot.margin = unit(c(1,3.72,1,1), "cm")) 


dd %>% ggplot(aes(x = x, y = y)) + geom_point() + 
    theme(plot.margin = unit(c(1,3.72,1,1), "cm")) 

dd %>% ggplot(aes(x = x, y = y)) + geom_point(aes(size = z)) + 
    theme(plot.margin = unit(c(1,1,1,1), "cm"), 
     legend.margin = unit(0.5, "cm"), 
     legend.text = element_text(size = 12))