2013-07-08 12 views
28

Cùng một tiêu đề, đã hoàn toàn viết lại câu hỏi.geom_rect và alpha - điều này có hoạt động với các giá trị mã hóa cứng không?

Tại sao alpha hoạt động trong ô đầu tiên nhưng không phải là thứ hai? Tôi đang đấu tranh để xem tại sao với giá trị hardcoded rect được rút ra ở đúng nơi nhưng không được thực hiện minh bạch nhưng khi trong một data.frame nó hoạt động như mong đợi?

mtcars$cyl <- factor(mtcars$cyl) 
mtcars$am <- factor(mtcars$am) 

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=data.frame(xmin=100, xmax=200, ymin=0, ymax=Inf), aes(xmin=xmin, xmax=xmax, ymin=ymin,ymax=ymax), fill="red", alpha=0.2) 

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 

Trả lời

56

Cảm ơn để làm rõ câu hỏi của bạn. Điều này thật khó hiểu với tôi, vì vậy tôi đã đi đến google, và kết thúc lên learning something new (sau khi làm việc xung quanh một số bất thường trong các ví dụ của họ). Rõ ràng những gì bạn đang làm là vẽ nhiều hình chữ nhật trên đầu trang của mỗi khác, có hiệu quả vô hiệu hóa bán minh bạch mà bạn muốn. Vì vậy, cách duy nhất để khắc phục điều này là mã hóa cứng các tọa độ hình chữ nhật trong một df riêng biệt, hoặc ...

ggplot() + 
    geom_density(data=mtcars, aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(aes(xmin=100, xmax=200, ymin=0,ymax=Inf), alpha=0.2, fill="red") 

... chỉ cần không gán dữ liệu của bạn.hơn toàn cầu cho cốt truyện. Thay vào đó, chỉ sử dụng nó trong (các) lớp bạn muốn (trong ví dụ này, geom_density) và để các lớp khác không có df! Hoặc, thậm chí tốt hơn, Sử dụng annotate để sửa đổi cốt truyện của bạn ra từ dưới df mặc định:

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    annotate("rect", xmin=100, xmax=200, ymin=0, ymax=Inf, alpha=0.2, fill="red") 

Phương pháp thứ hai cho phép bạn sử dụng một data.frame duy nhất cho toàn bộ cốt truyện, vì vậy bạn không cần phải chỉ định cùng một df cho mỗi lớp.

Cả hai phương pháp trở lô giống hệt nhau:

enter image description here

+2

Chỉ cần thêm vào này. Nếu bạn đang sử dụng điều này kết hợp với scale_y_continuous (nói limits = c (0,005,0.015), vì vậy chỉ định điểm break chính xác, bạn không thể có (ymin = 0, ymax = Inf), giá trị min/max của bạn phải giảm – nzcoops

+0

+1 Điều này giải thích tất cả các vấn đề đặc điểm kỹ thuật alpha mà tôi từng gặp với ggplot! – geotheory

+1

Điều này thật tuyệt! Nhưng tôi vẫn không hiểu tại sao 'geom_rect (..., alpha = .1)' doesn 't làm việc nhưng 'chú thích (" rect ", ... alpha = .1)' hiện. – Stuart

1
ggplot(df, aes(xmin = x, xmax = x + 1, ymin = y, ymax = y + 2)) + 
    geom_rect(alpha=.2) + 
    geom_rect(data=data.frame(xmin=3, xmax=6, ymin=3, ymax=5), 
      aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax), 
      fill="green", alpha=.2) 
+0

Cảm ơn @ user2559998. Tôi đã làm đồ chơi xung quanh với điều đó. Tuy nhiên, tôi không thấy làm thế nào đó là khác nhau để cứng mã hóa các giá trị:/ – nzcoops

7

workaround khác là cung cấp cho geom_rect một hàng duy nhất dữ liệu đối tượng để đảm bảo chỉ có một hình chữ nhật được vẽ:

ggplot(mtcars) + 
    geom_density(aes(x=disp, group=cyl, fill=cyl), alpha=0.6, adjust=0.75) + 
    geom_rect(data=mtcars[1,], aes(xmin=100, xmax=200, ymin=0,ymax=Inf), fill="red", alpha=0.2) 

enter image description here

+0

Đây là giải pháp bạn đang tìm kiếm nếu bạn đang có mặt. – Nova