2011-04-29 20 views
5

Tôi đã viết đoạn mã sau:ggplot2 geom_line() nên chỉ theo giá trị cụ thể

library(ggplot2) 

data <- structure(list(x = c(1L, 6L, 3L, 4L, 2L, 3L, 6L, 1L, 5L, 2L, 
        1L, 5L), y = c(1L, 7L, 5L, 6L, 3L, 4L, 6L, 2L, 5L, 6L, 5L, 2L 
      ), year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
          2L, 2L), .Label = c("2010", "2011"), class = "factor"), matching = structure(c(1L, 
          2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("person1", 
          "person2", "person3", "person4", "person5", "person6"), class = "factor")), .Names = c("x", 
      "y", "year", "matching"), row.names = c(NA, -12L), class = "data.frame") 

data$year <- factor(data$year) 

colors <- c("#4cb5ee", "#a0d099", "red") 

p <- ggplot(data, aes(x=x, y=y)) + 
    geom_point(aes(colour=year), shape=16, size=6) + 
    geom_line(aes(group=matching), arrow=arrow(length=unit(0.15,"cm")), colour="black", size=1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 

print(p) 

Nó cung cấp cho đầu ra sau đây: plot

Nhưng những gì tôi muốn geom_line() để làm là: luôn luôn trỏ vào điểm mà năm = 2011. Tôi không thể tìm ra lý do tại sao mũi tên của dòng là điểm đôi khi tại một điểm đề cập đến năm = 2010 và đôi khi điểm tại một điểm mà năm = 2011.

gì tôi phát hiện ra là mũi tên phải mất vài đối số:

arrow(angle = 30, length = unit(0.25, "inches"), ends = "last", type = "open") 

Vì vậy mà tôi có thể nói ends="first". Nhưng tôi không thể khái quát rằng ends luôn là first hoặc luôn luôn last.

Tôi đã cố gắng thêm cột vào data.frame của tôi có thông tin nếu mũi tên phải kết thúc trước hoặc cuối, nhưng nó không cho tôi kết quả tôi muốn.

Mọi trợ giúp đều được đánh giá cao :-)

Cảm ơn bạn trước!

Trả lời

9

geom_path nên làm các trick:

p <- ggplot(data, aes(x=x, y=y)) + 
    geom_point(aes(colour=year), shape=16, size=6) + 
    geom_path(aes(group=matching), 
        arrow=arrow(length=unit(0.15,"cm")), 
        colour="black", size=1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 

print(p) 

geom_path plot

+0

Đây là một giải pháp tốt hơn. Cách tiếp cận tôi đặt ra có thể cung cấp một số tính linh hoạt cho các tình huống phức tạp hơn, nhưng điều này phù hợp hơn cho nhiệm vụ trong tầm tay. – Chase

+1

Đánh tôi với nó. Tôi cho rằng tôi cần phải hài lòng rằng tôi (một người dùng không ggplot) đã ghép nó lại với nhau từ sự trợ giúp trực tuyến. –

+0

Cảm ơn giải pháp của bạn, nó thực sự dễ dàng ;-) –

4

Có lẽ là một cách hiệu quả hơn để làm điều này, nhưng có một cách tiếp cận là sử dụng geom_segment() thay vì geom_line(). Điều này sẽ cho phép bạn chỉ định điểm bắt đầu và kết thúc của dòng một cách dễ dàng. Chúng ta phải cơ cấu lại dữ liệu để chúng ta có thể chỉ định x, y, xend và yend. Tôi sẽ tái cơ cấu với hợp nhất, mặc dù bạn có thể có thể làm điều này với dàn diễn viên hoặc định hình lại.

zz <- merge(data[data$year == 2010 ,], data[data$year == 2011 ,] 
    , by = "matching", suffixes = 1:2) 

    matching x1 y1 year1 x2 y2 year2 
1 person1 1 1 2010 6 6 2011 
2 person2 6 7 2010 1 2 2011 
3 person3 3 5 2010 5 5 2011 
4 person4 4 6 2010 2 6 2011 
5 person5 2 3 2010 1 5 2011 
6 person6 3 4 2010 5 2 2011 

Sau đó chúng tôi sẽ sử dụng hai bộ dữ liệu trong cuộc gọi của chúng tôi để ggplot:

ggplot() +              #Blank call to ggplot 
    geom_point(data = data, aes(x=x, y=y, colour=year), shape=16, size=6) + #Points 
    geom_segment(data = zz, aes(x = x1, y = y1, xend = x2, yend = y2),   #Segments 
    arrow = arrow(length = unit(0.15, "cm")), colour = "black", size = 1) + 
    xlab("x") + ylab("y") + 
    scale_colour_manual("year", values=colors) + 
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) + 
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) 
+0

Cảm ơn công việc của bạn! Trong trường hợp của tôi, tôi cần các giải pháp được đăng tải, bởi vì tôi không muốn cơ cấu lại dữ liệu. Nhưng bạn đang phải này là tốt cho các tình huống phức tạp :-) –

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