控制ggplot2图例位置而不更改轴的比例

时间:2016-07-05 21:11:41

标签: r 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 个答案:

答案 0 :(得分: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 :(得分: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))