2016-11-15 21 views
5

Tôi đang cố gắng kết hợp alpha và điền vào ggplot2. Nó hoạt động khi tôi đang sử dụng geom_bar (hoặc geom_points, cho màu sắc), nhưng huyền thoại alpha không hoạt động khi tôi đang sử dụng geom_boxplot.huyền thoại alpha và điền vào ô ggplot2?

library(data.table) 
library(ggplot2) 
dt = data.table(x = rep(1:5,6), y = rnorm(30), tag1 = rep(c('hey', 'what'), 15), tag2 = rep(c('yeah', 'yeah', 'so', 'so', 'so'), 6)) 

Nó hoạt động cho tiệm ăn:

ggplot(dt[, list(y=mean(y)), by=list(x, tag1, tag2)], aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_bar(stat = 'identity', position = 'dodge') 

enter image description here

Nhưng không cho boxplot - truyền thuyết alpha trống.

ggplot(dt, aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_boxplot() 

enter image description here

Một phiên bản đơn giản có thể được thực hiện mà không có điền - nó có vẻ như giá trị mặc định thanh xám/lightgray, và mặc định boxplot sang màu trắng/lightwhite:

ggplot(dt[, list(y=mean(y)), by=list(x, tag2)], aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_bar(stat = 'identity') 

enter image description here

ggplot(dt, aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_boxplot() 

enter image description here

Nhưng tôi không thực sự chắc chắn làm thế nào để sửa lỗi này .. Bất kỳ suy nghĩ?

Trả lời

3

Tôi không chắc chắn lý do tại sao ggplot không thực sự cung cấp các mức alpha trong chú thích cho ô, nhưng bạn có thể mã hóa nó bằng cách sử dụng override.aes. (Lưu ý về biên tập: Tôi thấy tính thẩm mỹ của alpha hơi khó hiểu đối với ô chữ hoặc cốt truyện. Thật khó để phân tách sự minh bạch khỏi màu tô và chú giải alpha màu xám làm trầm trọng thêm vấn đề, bởi vì không có gì được ánh xạ tới màu xám trong cốt truyện.)

Trong mã bên dưới, để cải thiện khả năng hiển thị của chú giải, tôi đã xóa các dòng hộp khỏi chú thích alpha và tăng chiều cao khóa chú thích. Tôi cũng đã chỉnh sửa tính thẩm mỹ để loại bỏ nhu cầu đối số group.

ggplot(dt, aes(x=factor(x), y=y, fill=tag1, alpha=tag2)) + 
    geom_boxplot() + 
    scale_alpha_manual(values=c(0.2,0.7)) + 
    guides(alpha=guide_legend(override.aes=list(fill=hcl(c(15,195),100,0,alpha=c(0.2,0.7)), 
               colour=NA))) + 
    theme(legend.key.height=unit(1,"cm")) 

enter image description here

Một lựa chọn khác sẽ được sử dụng cho cả interaction điền và thẩm mỹ alpha, nhưng nó quay ra ggplot không bao gồm bất cứ màu gì trong trường hợp đó:

ggplot(dt, aes(x=factor(x), y=y, alpha=interaction(tag1,tag2)), 
     fill=interaction(tag1,tag2)) + 
    geom_boxplot() + 
    scale_fill_manual(values=rep(hcl(c(15,195),100,65), 2)) + 
    scale_alpha_manual(values=rep(c(0.3, 1), each=2)) + 
    theme(legend.key.height=unit(2,"cm")) 

enter image description here

Vì vậy, thay vào đó bạn có thể làm tất cả với tính thẩm mỹ, nhưng bao gồm độ trong suốt trong đặc điểm màu. Điều này làm việc, nhưng, một lần nữa, bởi vì tính minh bạch và màu sắc phần nào xen kẽ trong nhận thức thị giác, có lẽ tốt hơn là chỉ cần đi với bốn màu khác nhau.

ggplot(dt, aes(x=factor(x), y=y, fill=interaction(tag1,tag2,sep="-"))) + 
    geom_boxplot() + 
    scale_fill_manual(values=hcl(c(15,195,15,195),100,65, alpha=c(0.4,0.4,1,1))) + 
    theme(legend.key.height=unit(1,"cm")) + 
    labs(fill="Tag 1 - Tag 2") 

enter image description here

+0

Cảm ơn! Thật lạ lùng khi có hành vi khác nhau giữa thanh và ô chữ, và nó phải được sửa chữa theo cách thủ công, nhưng điều này chắc chắn hoạt động! Tôi đồng ý rằng trong ví dụ này alpha là khó hiểu. Trong kết quả cuối cùng của tôi, tôi đang sử dụng alpha để phân biệt giữa kết quả lý thuyết (trong suốt) và kết quả lộn xộn hơn bạn gặp phải do lỗi lấy mẫu, vv Vì vậy, tôi nghĩ * nó dễ đọc hơn. – benjamin

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