2015-07-29 22 views
6

Sử dụng ggplot2, làm cách nào tôi có thể vẽ đường xu hướng chạy giữa các mặt.ggplot, đường vẽ giữa các điểm trên các mặt

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) 

nào sản xuất như sau:

Output

Ở phía trên, tôi muốn vẽ một ranh giới giữa ba điểm, di chuyển trên khía cạnh.

+0

Nó có thể là hữu ích để cung cấp một số bối cảnh là tại sao nó sẽ là hữu ích để có một đường kéo dài giữa biểu đồ mặc dù các giá trị bị phá vỡ trong giá trị x. Một cách để đạt được điều này - mặc dù yêu cầu điều chỉnh thủ công - sẽ thêm điểm ngoài phạm vi xem (nghĩa là bên ngoài giới hạn trục x) khớp với vị trí của điểm đầu tiên trên bảng điều khiển tiếp theo. –

+0

ha ha .. 'library (df)', xin lỗi về điều đó .... –

+0

@PhilippeMarchand Nó mô tả hành vi chung giữa ba cấu hình thử nghiệm trong một bài báo mà tôi đang viết. –

Trả lời

15

Bạn có thể làm điều này, nhưng rẽ cắt ra có thể có những hậu quả không mong muốn,

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

Tôi không thể thực hiện công việc này, đã lỗi thời chưa? "Phiên bản R 3.4.1, gtable_0.2.0, ggplot2_2.2.1" – zx8754

+1

@ zx8754; nó cần được cập nhật do thay đổi ggplot – user20650

+1

@ user20650 Cảm ơn rất nhiều! Có phải vấn đề tương tự với vấn đề này không? https://stackoverflow.com/questions/42151880/ggplot-drawing-multiple-lines-across-facets/42171082#comment77259469_42171082 – zx8754

Các vấn đề liên quan