2015-07-29 16 views
6

ggplot2 kullanarak, yüzler arasında çalışan bir eğilim çizgisi nasıl çizebilirim. Aşağıdaki üretirggplot, yüzler arası noktalar arasında çizgi çizme

library(ggplot2) 
df <- data.frame(y=c(1,2,3),x=1,Set=LETTERS[1:3]) 
ggplot(df,aes(x,y)) + 
    theme_bw() + theme(legend.position=c(0,1),legend.justification=c(0,1)) + 
    geom_point(aes(fill=Set),color="black",shape=21,size=3) + 
    facet_grid(~Set) + 
    xlim(1,5) 

: Yukarıdaki olarak

Output

, ben aşamasından gelen hareket, üç nokta arasında bir çizgi çekmek istiyorum.

+0

O yararlı olacağını neden olarak bazı içerik sağlamak için yararlı olabilir arasında uzanan bir çizgi var x değerlerinde kırılmalara rağmen grafikler. Bunu elde etmenin bir yolu - manuel ayarlamayı gerektirse de - bir sonraki paneldeki ilk noktanın pozisyonuyla eşleşen görüş alanının dışında (yani x ekseni sınırları dışında) noktalar eklemek olacaktır. –

+0

ha ha .. 'kitaplık (df)', bu konuda üzgünüm .... –

+0

@PhilippeMarchand Yazdığım bir kağıda üç deneysel konfigürasyon arasındaki genel davranışı tanımlamak. –

cevap

15

Bunu yapabiliriz, ama istenmeyen sonuçlara yol açabilecek off klibi dönülerek,

library(ggplot2) 
df <- data.frame(y=c(1,2,3),x=1,Set=LETTERS[1:3]) 
p <- ggplot(df,aes(x,y)) + 
    theme_bw() + theme(legend.position=c(0,1),legend.justification=c(0,1)) + 
    geom_point(aes(fill=Set),color="black",shape=21,size=3) + 
    facet_grid(~Set) + 
    xlim(1,5) 

gb <- ggplot_build(p) 
g <- ggplot_gtable(gb) 

library(gtable) 
# ggplot2 doesn't use native units in data space 
# instead, the data is rescaled to npc, i.e from 0 to 1 
# so we need to use the build info to convert from data to [0,1] 
ranges <- gb$layout$panel_ranges 
data2npc <- function(x, range) scales::rescale(c(range, x), c(0,1))[-c(1,2)] 

start <- c(data2npc(1, ranges[[1]][["x.range"]]), 
      data2npc(1, ranges[[1]][["y.range"]])) 

end <- c(data2npc(1, ranges[[3]][["x.range"]]), 
      data2npc(3, ranges[[3]][["y.range"]])) 
# starting position in the first panel 
g <- gtable_add_grob(g, moveToGrob(start[1],start[2]), 
        t = 7, l = 4) 
# draw line to end position in last panel 
g <- gtable_add_grob(g, lineToGrob(end[1],end[2]), 
        t = 7, l = 8, r=8, z=Inf) 
# turn clip off to see the line across panels 
g$layout$clip <- "off" 
grid.newpage() 
grid.draw(g) 

enter image description here

+0

Bu işi yapamıyorum, bu modası geçmiş mi? "R sürüm 3.4.1, gtable_0.2.0, ggplot2_2.2.1" – zx8754

+1

@ zx8754; ggplot değişiklikleri nedeniyle güncellenmesi gerekiyor – user20650

+1

@ user20650 Çok teşekkürler! Bu sorun aynı mı? https://stackoverflow.com/questions/42151880/ggplot-drawing-multiple-lines-across-facets/42171082#comment77259469_42171082 – zx8754