2012-05-12 31 views
11

Tôi làm gì sai ở đây? Tôi đang cố gắng tô bóng hình chữ nhật hàng ngày thay thế 24 giờ với màu xám trong suốt. Nhưng chỉ có hình chữ nhật cuối cùng từ for-loop được rút ra (?!?) Nếu tôi làm những việc thủ công thay vì bởi vòng lặp nó hoạt động tốt.ggplot2: cách minh bạch che giấu các ngày thay thế trên một ô

Có cách nào để vector hóa điều này để tránh vòng lặp không? (Và nó có thể được thực hiện với qplot?) Tôi mới đến ggplot2 và có tôi đọc qua trang web, sách và ví dụ của Hadley.

Vấn đề thứ hai: cài đặt alpha về thẩm mỹ không ngăn hình chữ nhật che khuất nền. Làm thế nào để có được sự minh bạch?

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192)) 
# (ymin, ymax are computed for this series using min/max(na.rm==TRUE)) 
ymax <- 5.0 
ymin <- 0.0 
p <- ggplot(dat, aes(x=my_x_series,alpha=0.9)) 
alternate_daily_bars_xmin <- c(4,52,100,148) 

for (shade_xmin in alternate_daily_bars_xmin) { 
    shade_xmax <- min(shade_xmin+24, 192) # clamp at end of x-range 
    p <- p + geom_rect(aes(alpha=0.5,xmin=shade_xmin,xmax=shade_xmax,ymin=ymin,ymax=ymax), fill='gray80') 
} 
p <- p + geom_point(aes(y=my_y_series)) 
p 
+0

thêm nét ngẫu nhiên * dat * cho lặp lại. Đó là cú pháp lệnh đang đánh tôi. Tôi đoán mỗi geom_rect ghi đè cuối cùng thay vì tổng hợp như bạn có thể mong đợi. – smci

Trả lời

26

Để vẽ hình chữ nhật của bạn, hãy tạo khung dữ liệu trong đó mỗi hàng chứa tọa độ cho một hình chữ nhật duy nhất. Cấu trúc này hoạt động cho tất cả các đa giác, không chỉ là hình chữ nhật. Một khi bạn biết điều này, thật dễ dàng để tránh vòng lặp.

Sau đó, hãy cẩn thận xem bạn có ánh xạ biến đến thẩm mỹ hay không. Trong trường hợp của bạn, bạn cần phải đặt alpha thành bất kỳ giá trị nào bạn muốn, do đó, nó không phải là một phần của cài đặt aes().

library(ggplot2) 

dat <- data.frame(my_x_series=1:192, my_y_series=5.0*runif(192)) 
rect_left <- c(4,52,100,148) 
rectangles <- data.frame(
    xmin = rect_left, 
    xmax = rect_left + 24, 
    ymin = 0, 
    ymax = 5 
) 

ggplot() + 
    geom_rect(data=rectangles, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax), 
      fill='gray80', alpha=0.8) + 
    geom_point(data=dat, aes(x=my_x_series, y=my_y_series)) 

enter image description here

+0

Đẹp. Có thể một số hoặc tất cả điều này được thực hiện với * 'qplot()' *? – smci

+9

Có lẽ hầu hết tất cả, nhưng tôi chưa bao giờ bận tâm đến 'qplot'. 'ggplot' không thực sự khó học, và bạn luôn biết chính xác những gì bạn sẽ nhận được. Lấy làm tiếc. – Andrie

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