2014-12-08 23 views
8

Tôi có nhiều đường dẫn với nhiều đoạn. Làm cách nào để tô màu cho phân đoạn thứ N của mỗi đường dẫn có cùng màu?Phân đoạn đường dẫn màu trong ggvis/layer_paths

Ví dụ:

require(dplyr) 
require(ggvis) 
df <- data.frame(x = runif(10,0,10), y = runif(10,0,10), 
       group=c(rep(5,5),rep(10,5)), colorIdx=rep(c(1:5), 2)) 
df$group = factor(df$group) 

color_fun = colorRampPalette(c("yellow","blue"),5) 

myColors = color_fun(5) 

df$color = myColors[df$colorIdx] 

df %>% group_by(group) %>% 
    ggvis(~x, ~y, strokeWidth:=~group) %>% layer_paths(stroke :=~color) 

Các đường dẫn kết quả là đơn sắc - Tôi muốn họ mở rộng từ màu vàng sang màu xanh.

enter image description here

Sử dụng ggplot2, điều này có thể được thực hiện với:

require(ggplot2) 
ggplot(df, aes(x=x, y=y, group=group, colour=colorIdx, size=group)) + geom_path() + 
    scale_colour_gradient("", low="#FED863", high="#2A6EBB", limits=c(1,4)) 

enter image description here

+2

Dường như đây là một vấn đề mở - https://github.com/trifacta/vega/issues/122 – jalapic

Trả lời

5

Ràng buộc dường như là tất cả các phân đoạn trong nhóm group_by của dữ liệu cần phải cùng một màu sắc . Bạn có thể xoay quanh nó bằng cách tạo một nhóm nhân tạo cho mỗi phân đoạn, mỗi nhóm chỉ kết nối hai điểm. Điều này có nghĩa là bạn phải tăng gấp đôi mỗi hàng trong dữ liệu của mình ngoài các hàng đầu tiên và cuối cùng của từng nhóm ban đầu. Tôi đã minh họa điều này bằng tay lựa chọn các hàng với dữ liệu của bạn; sẽ có một cách để làm điều đó một cách lập trình hơn nhưng liệu điều này có đáng giá hay không phụ thuộc vào trường hợp sử dụng thực của bạn.

Đó là một chút phiền toái nhưng chắc chắn là một giải pháp thay thế.

df2 <- df[c(1,2,2,3,3,4,4,5, 6,7,7,8,8,9,9,10), ] 
df2$group2 <- c(rep(letters[1:4], each=2), rep(letters[6:9], each=2)) 

df2 %>% group_by(group2) %>% 
    ggvis(~x, ~y, strokeWidth:=~group) %>% 
    layer_paths(stroke :=~color) 

enter image description here

+0

Có cách nào để đạt được điều này mà không cần nhóm kể từ khi nhóm được tính toán đắt tiền nếu bạn đang đối phó với các bảng lớn và muốn làm cho lô của bạn năng động. –

+0

Tôi khá chắc chắn "không". Nhưng có thể có những cách khác để làm những gì bạn muốn một cách hiệu quả. –

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