2011-07-24 31 views
8

Tôi có một tập hợp các tọa độdòng liên tục và sử dụng Dashed ggplot

(x, y) = (0, 2), (1, 3), (1, 2), (2, 4)  (this is a simplified example) 

Bất cứ khi nào có sự gia tăng trong y-phối, tôi muốn tham gia vào các tọa độ của một dòng liên tục. Bất cứ khi nào có sự giảm xuống trong y-ordinate, tôi muốn tham gia các tọa độ bằng một đường đứt nét. Trong ví dụ trên,

1.) tọa độ (0, 2) và (1, 3) được nối bởi một đường thẳng,

2.) tọa độ (1, 3) và (1, 2) được nối bằng một đường đứt nét và

3.) tọa độ (1, 3) và (2, 4) được nối bằng một đường thẳng.

Có thể thực hiện điều này bằng ggplot trong R không? Cho đến nay, tôi chỉ có thể có một đường liên tục tham gia các tọa độ. (Nếu điều này có thể làm cho bất cứ điều gì dễ dàng hơn, tôi chỉ có một giảm trong các y-ordinate khi không có thay đổi trong x-ordinate.)

Cảm ơn bạn đã giúp đỡ của bạn!

Trả lời

7

thử này,

012.
dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4)) 

## add endpoints (xend, yend), and and id variable 
## tracking the sign of diff(y) 
dat2 <- with(dat, data.frame(x=x[-length(x)], y=y[-length(y)], 
          id= diff(y) > 0,xend=x[-1], yend=y[-1])) 

head(dat2) 
ggplot(dat2) + 
    geom_segment(aes(x=x, y=y, xend=xend, yend=yend, linetype=id)) + 
    scale_linetype_manual(values=c("dashed", "solid")) 
+0

Giống như câu trả lời của @ joran rất dễ hiểu, câu trả lời này hiệu quả hơn nhiều trong việc thực hiện nhiệm vụ. Cảm ơn bạn cũng cho bình luận của bạn. –

+0

+1 cho diff (y). –

5

(Đã chỉnh sửa để xóa một số báo cáo có khả năng gây nhầm lẫn ...)

Cảm ơn bạn đã đặt câu hỏi này! Lúc đầu, tôi nghĩ đó sẽ là khá khủng khiếp, nhưng sau đó tôi nhớ một mẹo nhỏ về cách bạn có thể lưu trữ một loạt các ggplot thành phần trong một danh sách, và nó hóa ra không đến nỗi tệ:

#Your example data 
dat <- data.frame(x=c(0,1,1,2),y=c(2,3,2,4)) 

#Initialize the list  
pathList <- vector("list",nrow(dat) - 1) 
#Loop over the data and put the appropriate `geom_line` in each slot 
for (i in 2:nrow(dat)){ 
    if (dat$y[i] - dat$y[i-1] >= 0){ 
     pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y)) 
    } 
    else{ 
     pathList[[i-1]] <- geom_line(data = dat[(i-1):i,],aes(x=x,y=y), 
           linetype="dashed") 
    } 
} 

p <- ggplot(data=dat,aes(x=x,y=y)) + pathList 

nào dẫn trong này:

enter image description here

Như đã đề cập trong các ý kiến, tuy nhiên, giải pháp này sẽ là khá kém hiệu quả ...

+0

Cảm ơn bạn rất nhiều vì đã dành thời gian. Điều này hoạt động tốt và dễ hiểu. –

+0

Giải pháp này sẽ không hiệu quả với một số lượng lớn các phân đoạn, vì nó không sử dụng thực tế là đồ họa lưới có chức năng vectơ hóa để vẽ nhiều đoạn cùng một lúc với các thông số thẩm mỹ khác nhau. – baptiste

+0

@baptiste - Thật vậy, máy của bạn đẹp hơn nhiều! – joran

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