使用ggplot绘制具有独特图例的绘图

时间:2017-12-01 00:57:21

标签: r layout plot ggplot2 grid-layout

我试图创建一个包含共享相同图例的图块的布局。图例位于第一个图的顶部,但是,下一个图具有不同的比例。我该如何解决这个问题?

library(ggplot2)
library(gridExtra)

grid.arrange(

ggplot(mpg, aes(displ, cty)) + 
  geom_point(aes(shape = "Data")) +
  stat_smooth(aes(linetype = "Regression"), method = "lm", 
              formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
  scale_shape_manual(values = 1) +
  labs(shape = "", linetype = "") +
  theme_classic() + 
  theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
        aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10),
        legend.position = "top")
,
ggplot(mpg, aes(displ, cty)) + 
  geom_point(shape = 1) +
  stat_smooth(method = "lm", 
              formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
  theme_classic() + 
  theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
        aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10))
)

IMAGE 1

3 个答案:

答案 0 :(得分:3)

如果绘图也有相同的轴标签,facet_wrap可能是一个不错的选择。

library(ggplot2)

data = rbind(data.frame("id" = 1, mpg), data.frame("id" = 2, mpg))

ggplot(data, aes(displ, cty)) + 
    geom_point(aes(shape = "Data")) +
    stat_smooth(aes(linetype = "Regression"), method = "lm", 
          formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
    scale_shape_manual(values = 1) +
    labs(shape = "", linetype = "") +
    theme_classic() + 
    facet_wrap(~id, ncol = 1 ) +
    theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
    aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10),
    legend.position = "top",
    strip.background = element_blank(),
    strip.text.x = element_blank()) #these two lines remove the facet strips

Resulting plot

答案 1 :(得分:2)

grid.arrange不会尝试对齐情节面板;它是一个适用于各种网格图形的通用函数,在这种情况下,由于顶部的图有一个图例,它会缩小以适应可用空间(默认情况下,这里是页面的1/2)。对于ggplots的具体情况,我会使用egg::ggarrange

library(ggplot2)
library(egg)

ggarrange(

  ggplot(mpg, aes(displ, cty)) + 
    geom_point(aes(shape = "Data")) +
    stat_smooth(aes(linetype = "Regression"), method = "lm", 
                formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
    scale_shape_manual(values = 1) +
    labs(shape = "", linetype = "") +
    theme_classic() + 
    theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
          aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10),
          legend.position = "top")
  ,
  ggplot(mpg, aes(displ, cty)) + 
    geom_point(shape = 1) +
    stat_smooth(method = "lm", 
                formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
    theme_classic() + 
    theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
          aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10))
)

答案 2 :(得分:1)

我不知道如何使用grid.arrange,但这是使用我的cowplot套餐的解决方案。我们的想法是将图例与图表分开,然后将这三个元素放在一列中。我认为,类似的方法适用于grid.arrange

library(cowplot)

p1 <- ggplot(mpg, aes(displ, cty)) + 
  geom_point(aes(shape = "Data")) +
  stat_smooth(aes(linetype = "Regression"), method = "lm", 
              formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
  scale_shape_manual(values = 1) +
  labs(shape = "", linetype = "") +
  theme_classic() + 
  theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
        aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10),
        legend.position = "top")

p2 <- ggplot(mpg, aes(displ, cty)) + 
  geom_point(shape = 1) +
  stat_smooth(method = "lm", 
              formula = y ~ x, se = FALSE, colour = 1, size = 0.5) +
  theme_classic() + 
  theme(panel.border = element_rect(colour = "black", fill=NA, size = 0.5),
        aspect.ratio = 1, axis.text = element_text(colour = 1, size = 10))

legend <- get_legend(p1)
plot_grid(legend, p1 + theme(legend.position = "none"), p2,
          ncol=1, rel_heights = c(0.1, 1, 1))

enter image description here