2016-09-29 11 views
5

Sadece ggplot olsun, R için yeniyim, bu yüzden aşağıdaki örnekle ilgili herhangi bir sorun için şimdiden özür dilerim.Kombine ggplot'taki lejant konumu

Mevcut sorulardan örnekler kullanarak, iki ayrı ggplots'u birleştirmek için kodu bir araya getirmeye çalıştım. Son arsanın efsanesini, grafiğin üzerinde bulunacak şekilde nasıl değiştirebileceğimi merak ediyorum. Bireysel ggplots için legend.postion'u "top" olarak değiştirmeyi denedim, ancak işe yaramıyor.

'

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

Grafikleri birleştirmek önemsizdir. Bazı örnekler için buraya bir göz atın: https://www.stat.auckland.ac.nz/~paul/RGraphics/chapter3.html –

+0

Bu yaklaşımı başarıyla kullandım: http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_ (ggplot2)/ –

+0

Bu siteyi de faydalı bulabilirsiniz: http://r-statistics.co/ggplot2-cheatsheet.html#Change%20legend%20position – NajlaBioinfo

cevap

2

Sen don (Benim sorun göstermek için gerekli düşündüğünüze dair minimuma örnekte kod tutmak için ikinci y ekseni yaratılmasını dışarı bırakmış unutmayın) İki ayrı araziyi birleştirmemiz gerekir. Ggplot yaklaşımı, bunu iki katman, bir çubuk katman ve bir çizgi katman ile tek bir arsa olarak düşünmektir. Bu yüzden sadece bu katmanları tek bir arsaya nasıl yerleştireceğimizi anlamaya ihtiyacımız var. Örneğin:

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

Biz burada herhangi bir efsane jimnastik gerek yoktu çıktı. Bununla birlikte, ayrı ayrı grafikleri tek bir gösterge ile birleştirmeniz gerekiyorsa, here, here ve here bazı örneklerdir.

+0

Örnekler için teşekkürler. İki ayrı parselin birleştirilmesini istediğim neden, sonunda hem sol hem de sağ y eksenini kullanmak istediğimdi. Böylece çubuk grafikler soldaki y değerlerini eşler ve çizgiler sağdaki y değerlerini eşler. (Boyutu aşağı tutmaya çalışmak için orijinal yazımdan dışarı çıktım) Bağlantılarınızdan birini takip edip efsaneyi p2 plotundan bir grob olarak çıkarabiliyorum, sonra grid.arrange() öğesini kullanıyorum. kombine arsa ve efsaneyi tekrar ekleyin? – Boost

+0

Evet, açıkladığınız gibi yapabilirsin. – eipi10

İlgili konular