2013-05-01 36 views
12

Giả sử tôi không cần ánh xạ biến 'thích hợp' nhưng vẫn muốn có các khóa chú giải để giúp hiểu biểu đồ. dữ liệu thực tế của tôi cũng tương tự như các df sauCác khóa chú giải khác nhau bên trong cùng một chú giải trong ggplot2

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

library(ggplot2) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points")) 

enter image description here

Về cơ bản, tôi muốn truyền thuyết then chốt liên quan đến points là .. chỉ là một điểm, mà không cần dòng ở giữa. Tôi đã gần với điều này:

library(reshape2) 

df <- melt(df, id.vars="id") 

ggplot() + 
    geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) + 
    geom_line(aes(id, value, colour = variable), df[df$variable=="line",]) 

nhưng nó xác định hai truyền thuyết riêng biệt. Việc sửa mã thứ hai (và phải định hình lại dữ liệu của tôi) cũng sẽ ổn, nhưng tôi thích cách (nếu có) để thay đổi bất kỳ khóa chú giải nào theo cách thủ công (và tiếp tục sử dụng lần đầu tiên). Cảm ơn!

EDIT:

cảm ơn @alexwhan bạn đã làm mới bộ nhớ của tôi về ánh xạ biến. Tuy nhiên, cách dễ nhất tôi đã có cho đến nay vẫn là như sau (rất xấu Hack!):

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10)) 

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, shape = "points")) + 
    theme(legend.title=element_blank()) 

mà chỉ được che giấu tên của hai truyền thuyết khác nhau.

enter image description here

Các ý tưởng khác được hoan nghênh !!!

Trả lời

25

Bạn có thể sử dụng override.aes= bên trong guides() chức năng để thay đổi giao diện mặc định của chú giải. Trong trường hợp này, hướng dẫn của bạn là color= và sau đó bạn nên đặt shape=c(NA,16) để xóa hình dạng cho đường kẻ và sau đó linetype=c(1,0) để xóa đường kẻ khỏi điểm.

ggplot(df) + 
    geom_line(aes(id, line, colour = "line")) + 
    geom_point(aes(id, points, colour = "points"))+ 
    guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0)))) 

enter image description here

+0

phương pháp rất đẹp. Có lẽ là tốt nhất có sẵn. Tôi chỉ muốn chờ một người khác, nhưng có vẻ như đây cũng là người duy nhất :-). Dù sao, cảm ơn rất nhiều! – Michele

6

Tôi không biết cách nào để làm điều này một cách dễ dàng, nhưng bạn có thể làm một phiên bản Hack như thế này (sử dụng dataframe tan chảy của bạn):

p <- ggplot(df.m, aes(id, value)) + 
    geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) + 
    geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1)) 

enter image description here

Điều quan trọng là những gì bạn cần để có được ánh xạ đúng để nó được hiển thị chính xác trong chú giải. Trong trường hợp này, làm cho nó 'đúng', có nghĩa là lừa nó để tìm cách bạn muốn nó. Nó có thể có giá trị chỉ ra điều này chỉ hoạt động bởi vì bạn có thể thiết lập linetype để trống (0) và sau đó sử dụng quy mô alpha cho các điểm. Bạn không thể sử dụng alpha cho cả hai, bởi vì nó sẽ chỉ mất một tỷ lệ.

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