2016-01-25 18 views
9

Gần đây tôi đã nâng cấp lên phiên bản R 3.2.3 và cũng với phiên bản ggplot 2.0.0.Ggplot2 hành vi alpha khác nhau

Cố gắng nâng cấp một số mã cũ lên các phiên bản mới hơn mà tôi gặp phải một hành vi lạ với ggplot2 và cài đặt độ trong suốt của nó.

Bây giờ câu hỏi của tôi là, đây có phải là một lỗi hoặc một tính năng (nếu có, ai đó có thể khai sáng cho tôi biết tại sao nó tốt để có nó theo cách này)? Kết quả tôi muốn có là (rõ ràng) cốt truyện 2.

Nói rằng tôi vẽ một dòng và đặt một hình chữ nhật với tính minh bạch qua nó như thế này:

library(ggplot2) 

plot_data <- data.frame(x = 1:100, y = rnorm(100)) 

# Plot 1 
ggplot(data = plot_data, aes(x = x, y = y)) + 
    geom_line() + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 1") 

# Plot 2 
ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", 
      alpha = 0.1) + ggtitle("Plot 2") 

Để hiểu biết của tôi cốt truyện 1 và 2 nên được giống hệt nhau . Tuy nhiên, tôi nhận được lô sau:

Lô 1:

Plot1

và cốt truyện 2:

Plot2

Thêm vào đó, nếu tôi chơi xung quanh với alpha -values ​​(đối với ví dụ: đặt chúng thành 0.01, tôi nhận được hai ô sau:

Plot1a

Plot2a

+3

trong cốt truyện 2, nếu bạn thêm dữ liệu = plot_data vào geom_rect(), bạn sẽ nhận được kết quả tương tự như plot1 – MLavoie

+0

Điều thú vị, nhưng không phản ánh alpha của 0,1 (khá trong suốt) đối với hiểu biết của tôi ! – David

Trả lời

2

Tôi tin rằng gọi geom_rect mà không có một tham số data hiệu quả sẽ vẽ một hình chữ nhật cá nhân cho mỗi hàng của data.frame đó là lý do alpha là "làm việc", nhưng không hoàn toàn như mong đợi. Tôi đã không thể tái tạo và đạt được tính chẵn lẻ/thỏa thuận giữa các phương pháp, nhưng như bạn đã lưu ý, tôi nghĩ rằng nó đang làm điều gì đó dọc theo đường vẽ 100 hình chữ nhật riêng lẻ hoặc 30 (chiều rộng của hình chữ nhật; 50) đó là lý do tại sao alpha = 0.1/100alpha = 0.1/30 giúp bạn gần gũi hơn, nhưng không hoàn toàn phù hợp.

Bất kể, tôi có lẽ sẽ sử dụng annotate, như mô tả tốt hơn hành vi/kết quả mà bạn đang cố gắng để đạt được mà không vấn đề và hoạt động, như mong đợi, trong cả hai trường hợp - annotations sẽ vẽ một đơn dụ mỗi geom:

ggplot(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red")) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, alpha = 0.1, fill = "red") + 
    geom_line() + 
    ggtitle("Plot 1") 

ggplot() + 
    geom_line(data = plot_data, aes(x = x, y = y)) + 
    # geom_rect(aes(xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf), fill = "red", alpha = 0.1) + 
    annotate("rect", xmin = 20, xmax = 50, ymin = -Inf, ymax = Inf, fill = "red", alpha = 0.1) + 
    ggtitle("Plot 2") 
+0

Vẽ 1 hình chữ nhật cho mỗi hàng có lẽ là nguyên nhân gây ra nó, ít nhất nó có vẻ hợp lý với tôi! – David

+0

@David đã tìm thấy [câu hỏi tương tự ở đây] (http://stackoverflow.com/q/15903868/2572423) mà ám chỉ đến cùng một logic/lý luận; nó vẫn làm phiền tôi rằng tôi không thể khiến họ "phù hợp". – JasonAizkalns

+0

Tôi cũng tình cờ gặp [câu hỏi này] (http://stackoverflow.com/questions/17521438/geom-rect-and-alpha-does-this-work-with-hard-coded-values) đề cập đến chỉ sử dụng một câu hỏi hàng trong 'geom_rect' .. – David

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