2016-09-29 58 views
5

我是R新手,更不用說ggplot了,所以我提前爲我的示例下面的任何問題表示歉意。聯合ggplot中的圖例位置

使用來自現有問題的示例,我試圖將代碼組合起來,將兩個單獨的ggplots組合起來。我想知道如何將最終情節的圖例移動到圖表上方。我嘗試將legend.postion更改爲單獨ggplots的「頂部」,但似乎不起作用。

(請注意,我已經離開了第二個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) 
+0

組合地塊是非平凡的。看看這裏的一些例子:https://www.stat.auckland.ac.nz/~paul/RGraphics/chapter3.html –

+0

我已經成功地使用了這種方法:http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ –

+0

您可能也覺得這個網站也有幫助:http://r-statistics.co/ggplot2-cheatsheet.html#Change%20legend%20position – NajlaBioinfo

回答

2

你不」 t需要結合兩個獨立的地塊。 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") 

enter image description here

原來,我們並不需要任何的傳奇體操這裏。但是,如果您確實需要將單獨的圖與單個圖例合併,則可以使用hereherehere

+0

感謝您的例子。我想結合兩個獨立的情節的原因是因爲我最終想要使用左右兩個y軸。所以條形圖將映射到左側的y值,並且這些線將映射到右側的y值。 (我離開了我的原始帖子的代碼,以儘量減少尺寸) 我不知道我是否可以按照你的鏈接之一,並從p2圖提取圖例作爲grob,然後使用grid.arrange()on合併的情節,並添加傳說回來? – Boost

+0

是的,你可以按照你的描述來完成。 – eipi10