Cách đặt chú giải alpha với ggplot2


81

Tôi có một biểu đồ về tốc độ gió so với hướng có một số điểm rất lớn và tôi đang sử dụng alpha = I (1/20) ngoài color = month

Đây là một mẫu mã:

library(RMySQL)
library(ggplot2)
con <- dbConnect(...)
wind <- dbGetQuery(con, "SELECT speed_w/speed_e AS ratio, dir_58 as dir, MONTHNAME(timestamp) AS month, ROUND((speed_w+speed_e)/2) AS speed FROM tablename;");

png("ratio-by-speed.png",height=400,width=1200)
qplot(wind$dir,wind$ratio,ylim=c(0.5,1.5),xlim=c(0,360),color=wind$month,alpha=I(1/30),main="West/East against direction")
dev.off()

Điều này tạo ra một biểu đồ khá, tuy nhiên vấn đề của tôi là alpha của chú giải cũng là 1/30, điều này khiến nó không thể đọc được. Có cách nào tôi có thể buộc chú giải là 1 alpha không?

Đây là một ví dụ: Biểu đồ ví dụ

Câu trả lời:


110

Cập nhật Với việc phát hành phiên bản 0.9.0, bây giờ người ta có thể ghi đè các giá trị thẩm mỹ trong chú giải bằng cách sử dụng override.aestrong guideshàm. Vì vậy, nếu bạn thêm một cái gì đó như thế này vào cốt truyện của mình:

+ guides(colour = guide_legend(override.aes = list(alpha = 1)))

nên làm vậy.


Tôi đã giải quyết vấn đề này bằng cách thực hiện một cuộc gọi trùng lặp tới geom bằng cách sử dụng một tập con dữ liệu trống và sử dụng chú giải từ cuộc gọi đó. Thật không may, nó không hoạt động nếu khung dữ liệu thực sự trống (ví dụ như bạn nhận được từ đó subset(diamonds,FALSE)) vì ggplot2 dường như xử lý trường hợp này giống như nó xử lý NULLthay cho khung dữ liệu. Nhưng chúng ta có thể có được hiệu ứng tương tự bằng cách lấy một tập hợp con chỉ có một hàng và đặt nó NaNtrên một trong các kích thước của ô, điều này sẽ ngăn không cho nó bị vẽ.

Dựa trên ví dụ của Chase:

# Alpha parameter washes out legend:
gp <- ggplot() + geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1)
print(gp)

# Full color legend:
dummyData <- diamonds[1, ]
dummyData$price <- NaN
#dummyData <- subset(diamonds, FALSE)   # this would be nicer but it doesn't work!
gp <- ggplot() +
  geom_point(data=diamonds, aes(depth, price, colour=clarity), alpha=0.1, legend=FALSE) + 
  geom_point(data=dummyData, aes(depth, price, colour=clarity), alpha=1.0, na.rm=TRUE)
print(gp)

1
Xuất sắc. Giải pháp này thật tuyệt vời. Chỉ có một vòng để thử nó ra. Hoạt động một điều trị
Chris

3
1 cho @ cập nhật Joran (và một hack tuyệt vời mà bây giờ không cần thiết)
Gregor Thomas

Tôi đang sử dụng phiên bản 0.9.3.1 nhưng nó không hoạt động với tôi. Tôi đã đặt guides()chức năng ở nhiều vị trí khác nhau nhưng tôi không nhận được hành vi như mong đợi. Bất kỳ gợi ý?
polarize

Để thêm vào một chủ đề cũ, bạn phải thay đổi colourtùy thuộc vào những gì bạn đang sử dụng để đặt màu. Ví dụ: tôi đã sử dụng giải pháp trên guides(fill = guide_legend(...))vì tôi đã sử dụng aes(fill = val)cho âm mưu của mình
Mxblsdl

4

Một chút googling đã bật ra bài đăng này dường như không cho thấy rằng ggplot hiện hỗ trợ tùy chọn này. Những người khác đã giải quyết các vấn đề liên quan bằng cách sử dụng gridExtra và sử dụng ViewPorts như đã thảo luận ở đây .

Tôi không phức tạp đến mức đó, nhưng đây là một cách tiếp cận sẽ mang lại cho bạn kết quả mong muốn. Cách tiếp cận là vẽ đồ thị địa lý hai lần, một lần không có tham số alpha và nằm ngoài vùng vẽ đồ thị thực. Geom thứ hai sẽ bao gồm tham số alpha và loại bỏ chú giải. Sau đó, chúng tôi sẽ chỉ định vùng vẽ biểu đồ với xlim và ylim. Cho rằng bạn có rất nhiều điểm, điều này sẽ tăng gần gấp đôi thời gian lập kế hoạch, nhưng sẽ mang lại cho bạn hiệu quả như mong đợi.

Sử dụng tập dữ liệu kim cương:

#Alpha parameter washes out legend
ggplot(data = diamonds, aes(depth, price, colour = clarity)) + 
geom_point(alpha = 1/10)

#Fully colored legend
ggplot() +
geom_point(data = diamonds, aes(depth, price, colour =clarity), alpha = 1/10, legend = FALSE) + 
geom_point(data = diamonds, aes(x = depth - 999999, y = price - 999999, colour = clarity)) +
xlim(40, 80) + ylim(0, 20000) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.