2016-09-29 37 views
5

ggplotを除いて、私はRの新人ですので、下の例で問題が発生した場合は事前にお詫びします。ggplotを組み合わせた場合の凡例の場所

既存の質問の例を使用して、2つの別々のggplotを組み合わせるコードをまとめようとしました。最終的なプロットの伝説をどのようにグラフの上に置くことができるのだろうかと思っています。私は個々のggplotsのlegend.postionを "top"に変更しようとしましたが、動作しないようです。

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 /グラフ/ Multiple_graphs_on_one_page_(ggplot2)/ –

+0

このサイトも参考になります:http://r-statistics.co/ggplot2-cheatsheet.html#Change%20legend%20position – NajlaBioinfo

答えて

2

あなたはドン(私は私の問題を説明するために必要と思われるものの最小に例のコードを維持するために、第2のy軸の創出を残していることに注意してください) 2つの別々のプロットを組み合わせる必要があります。 ggplotのアプローチは、これをバーレイヤーとラインレイヤーの2つのレイヤーを持つ単一のプロットと考えることです。ですから、これらのレイヤーを単一のプロットに配置する方法を理解するだけです。たとえば、次のように

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

それは私たちがここに伝説の体操を必要としなかったことが判明。しかし、別のプロットを1つの凡例と組み合わせる必要がある場合は、herehere、およびhereがあります。

+0

サンプルをありがとうございます。 2つの別々のプロットを結合したい理由は、最終的に左右のy軸の両方を使いたいからです。したがって、棒グラフは左のy値にマップされ、線は右のy値にマップされます。 (元の投稿のコードをそのまま残しておいてください) あなたのリンクの1つに従って、p2プロットからgrobとして凡例を抽出してから、grid.arrange()を使うことができますか?結合されたプロットと凡例を再び追加しますか? – Boost

+0

はい、あなたはあなたが記述した通りに正確に行うことができます。 – eipi10

関連する問題