2013-08-23 38 views
36

Tôi đang cố gắng để có được một chú giải tùy chỉnh cho một ggplot với dữ liệu đến từ hai khung dữ liệu riêng biệt. Xem dưới đây cho một ví dụ tái sản xuất tối thiểu.R: Chú thích tùy chỉnh cho nhiều lớp ggplot

Những gì tôi đang cố gắng hoàn thành là có một chú thích mô tả điền ribbon, đường màu đen và đường màu đỏ.

require(ggplot2) 
x=seq(1,10,length=100) 
data=data.frame(x,dnorm(x,mean=6.5,sd=1)) 
names(data)=c('x','new.data') 
x.ribbon=seq(1,10,length=20) 
ribbon=data.frame(x.ribbon, 
        dnorm(x.ribbon,mean=5,sd=1)+.01, 
        dnorm(x.ribbon,mean=5,sd=1)-.01, 
        dnorm(x.ribbon,mean=5,sd=1)) 
names(ribbon)=c('x.ribbon','max','min','avg') 
ggplot()+geom_ribbon(data=ribbon,aes(ymin=min,ymax=max,x=x.ribbon),fill='lightgreen')+ 
    geom_line(data=ribbon,aes(x=x.ribbon,y=avg),color='black')+ 
    geom_line(data=data,aes(x=x,y=new.data),color='red')+ 
    xlab('x')+ylab('density') 

enter image description here

Trả lời

57

Thay vì đặt colourfill, bản đồ chúng sử dụng thẩm mỹ hình học aes và sau đó sử dụng scale_xxx_manual hay scale_xxx_identity.

Ví dụ

ggplot()+geom_ribbon(data=ribbon,aes(ymin=min,ymax=max,x=x.ribbon,fill='lightgreen'))+ 
    geom_line(data=ribbon,aes(x=x.ribbon,y=avg,color='black'))+ 
    geom_line(data=data,aes(x=x,y=new.data,color='red'))+ 
    xlab('x')+ylab('density') + 
    scale_fill_identity(name = 'the fill', guide = 'legend',labels = c('m1')) + 
    scale_colour_manual(name = 'the colour', 
     values =c('black'='black','red'='red'), labels = c('c2','c1')) 

enter image description here

Lưu ý rằng bạn phải xác định guide = 'legend' để buộc scale_..._identity để tạo ra một huyền thoại.

scale_...manual bạn có thể chuyển một vector có tên cho các giá trị - tên phải là thứ bạn gọi là màu trong các cuộc gọi đến geom_... và sau đó bạn có thể gắn nhãn độc đáo.

+12

Tôi mất một thời gian mới nhận ra rằng tôi đã đặt màu ngoài định nghĩa thẩm mỹ. Đó là một sự khác biệt tinh tế. – scs217

+5

+1. BTW, để làm rõ thêm, tôi sẽ nói: 'geom_line (aes (..., color = 'a') ...)' và sau đó 'scale_color_manual (..., values ​​= c ('a' = 'black' , ...)) '. Bằng cách đó, rõ ràng rằng chuỗi trong 'aes (color = 'string')' chỉ là một ràng buộc, màu thực tế sẽ là bất kỳ thứ gì bạn định nghĩa trong 'scale_color_manual()'. –

+1

Cảm ơn vì điều này! Tôi đồng ý với @ scs217 rằng sự khác biệt tinh tế giữa việc thiết lập màu trong 'geom_line (color = x)' vs trong 'geom_line (aes (color = x))' có thể dễ dàng bị bỏ qua. Tôi đã đề xuất chỉnh sửa để nhấn mạnh hơn vào điều đó. – JanLauGe

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