组合 ggplot 中图例的位置

5

我对R甚至ggplot都不熟悉,因此提前为我的示例可能存在的任何问题道歉。

我尝试使用现有问题的示例来组合代码,以将两个单独的ggplot合并。我想知道如何将终图的图例移动到图形上方。我尝试将各自的ggplot的legend.position更改为“top”,但似乎不起作用。

(请注意,我省略了创建第二个y轴,以使示例代码尽可能少,以便说明我的问题)

    library(ggplot2)
    library(gtable)
    library(reshape2)
    library(grid)
    library(scales)

    df.test <- data.frame(
        x_cat = factor(c(1, 2, 3, 4)),
        count = seq(1:4),
        line1 = seq(from = 1, to = 4, length.out = 4),
        line2 = seq(from = 0, to = 3, length.out = 4)
    )

    p1 <- ggplot( data = df.test , aes(x=x_cat, y=count) ) +
          geom_bar( stat="identity" ) +
          xlab( "X Label" ) +
          ylab( "Y Label 1" ) +
          theme(panel.background = element_rect(colour = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                legend.position = "bottom")
    g1 <- ggplotGrob( p1 )

    df.test2 <- melt( df.test[-2] )
    p2 <- ggplot( data = df.test2 , aes(x=x_cat, y=value, colour=variable ) ) +
          geom_line( aes(group=variable) ) +
          ylab( "Y Label 2" ) +
          theme(panel.background = element_rect(fill = NA, colour = "white"),
                panel.grid.major = element_blank(),
                panel.grid.minor = element_blank(),
                legend.position = "bottom") 
    g2 <- ggplotGrob(p2)

    pp <- c(subset(g1$layout, name == "panel", se = t:r))
    g <- gtable_add_grob(g1, g2$grobs[[which(g2$layout$name == "panel")]], pp$t, pp$l, pp$b, pp$l)

    pp <- c(subset(g2$layout, name == "guide-box", se = t:r))
    g <- gtable_add_grob(g, g2$grobs[[which(g2$layout$name == "guide-box")]], t=pp$t, l=pp$l, b=pp$b, r=pp$r)

    grid.draw(g)

合并绘图并不是一件简单的事情。请查看此处以获取一些示例:https://www.stat.auckland.ac.nz/~paul/RGraphics/chapter3.html - Daniel Wisehart
我已经成功地使用了这种方法:http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ - Joshua Rosenberg
你可能也会发现这个网站很有帮助:http://r-statistics.co/ggplot2-cheatsheet.html#Change%20legend%20position - NajlaBioinfo
1个回答

2

您不需要将两个独立的图形组合在一起。 ggplot的方法是将其视为具有两个层的单个图形,一个是条形图层,另一个是线性图层。因此,我们只需要找出如何将这些层放在单个图形上就可以了。例如:

library(ggplot2)
library(reshape2)

df.test <- data.frame(
  x_cat = factor(c(1, 2, 3, 4)),
  count = seq(1:4),
  line1 = seq(from = 1, to = 4, length.out = 4),
  line2 = seq(from = 0, to = 3, length.out = 4)
)

df.test2 = melt(df.test, id.var=c("x_cat", "count"))

ggplot() +
  geom_bar(data=subset(df.test2, variable=="line1"), aes(x=x_cat, y=count), 
           stat="identity" ) +
  geom_line(data=df.test2, aes(x=x_cat, y=value, colour=variable, group=variable)) +
  xlab( "X Label" ) +
  ylab( "Y Label 1" ) +
  theme(panel.background = element_rect(colour = "white"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        legend.position = "top")

在此输入图片描述

事实证明,我们这里不需要任何传说中的体操。但是,如果您确实需要将单独的图形组合成一个图例,请参考这里这里这里的示例。


谢谢你提供的示例。我想要合并两个不同的图是因为我最终需要使用左右y轴。所以条形图将映射到左边的y值,而折线图将映射到右边的y值。(我在原帖中省略了这段代码,以尝试减小大小)我想知道是否可以跟随您提供的链接之一,并从p2图中提取传说作为grob,然后在合并的图上使用grid.arrange()并将传说添加回去? - Boost
是的,您可以按照您所描述的方式进行操作。 - eipi10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接