2012-04-18 28 views
10

Tôi hiện đang làm việc trên một dự án liên quan đến việc tạo lô rất giống với ví dụ trong trang ggplot2 0.9.0 của Hadley liên quan đến stat_density2d().ggplot2: Đặt alpha = 0 cho các điểm nhất định tùy thuộc vào giá trị điền

library(ggplot2) 
dsmall <- diamonds[sample(nrow(diamonds), 1000), ] 
d <- ggplot(dsmall, aes(carat, price)) + xlim(1,3) 
d + stat_density2d(geom="tile", aes(fill = ..density..), contour = FALSE) 
last_plot() + scale_fill_gradient(limits=c(1e-5,8e-4)) 

enter image description here

Bây giờ, những gì tôi đang phải vật lộn với một cách để cơ bản biến alpha tắt (alpha = 0) cho tất cả các gạch không điền tầm xa. Vì vậy, mỗi ô màu xám nhìn thấy trong hình ảnh, alpha phải được đặt thành 0. Điều này sẽ làm cho hình ảnh đẹp hơn rất nhiều, đặc biệt là khi chồng lên trên bản đồ chẳng hạn.

Nếu có bất kỳ đề xuất nào, điều này sẽ được đánh giá cao.

+3

Các vùng màu xám được điều khiển bởi các lập luận na.value để scale_fill_gradient, nhưng ngay cả khi tôi chỉ định một màu trong suốt (như na.value = rgb (1,1,1,0)) nó xuất hiện mờ đục, vì vậy phải có cái gì đó khác đang diễn ra. – Fojtasek

+0

Được rồi, vì vậy có lẽ nếu chúng ta có thể đặt giới hạn của scale_alpha_continuous phụ thuộc vào giá trị điền (mật độ), sau đó đặt alpha na.value = 0 ... –

+0

không may mắn cho đến nay, mặc dù cài đặt thành 'gray90' làm cho nó trông * gần như * OK vì đó là màu của lưới nền ... Tôi thực sự nghi ngờ đây là một "vấn đề" ggplot (buglet/wishlist?) ... có thể liên quan đến https://github.com/hadley/ggplot2/số/475? –

Trả lời

9

Điều này dường như làm việc:

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., 
    alpha=cut(..density..,breaks=c(0,1e-5,Inf))), 
    contour = FALSE)+ 
scale_alpha_manual(values=c(0,1),guide="none") 

enter image description here

+0

Hoàn hảo! Cảm ơn vì sự giúp đỡ của bạn, Ben. –

+0

Điều này thật tuyệt vời, đã giúp tôi rất nhiều. Tôi sẽ cung cấp cho nó 3 upvotes nếu tôi có thể. – cengel

11

Một khả năng khác, chỉ cần sử dụng ifelse thay vì cut.

d + stat_density2d(geom="tile", 
    aes(fill = ..density.., alpha = ifelse(..density.. < 1e-5, 0, 1)), 
    contour = FALSE) + 
scale_alpha_continuous(range = c(0, 1), guide = "none") 

enter image description here

+0

Điều này cũng hoạt động tuyệt vời. Bạn có thể giải thích tại sao nó không đủ để đặt 'alpha' trong các tùy chọn' aes (..) ', nhưng tại sao tính minh bạch của vùng điền chỉ có thể được điều khiển bằng cách thiết lập phạm vi với' scale_alpha_continuous'? Ví dụ, tôi đã sử dụng 'alpha = ifelse (.. density .. <1e-5, 0, 0.7)' và 'scale_alpha_continuous (phạm vi = c (0, 0.7))' để làm cho vùng tô đầy trong suốt. – cengel

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