2012-05-12 32 views
11

我在這裏做錯了什麼? 我正在嘗試用透明灰色替換24小時日常矩形。但是隻有for-loop的最後一個矩形被繪製(?!?)如果我手動執行而不是通過for-loop,它可以正常工作。ggplot2:如何在陰謀中透明地遮陰備用日子

有沒有一種方法可以將矢量化以避免for-loop? (可以用qplot完成嗎?) 我是ggplot2的新手,是的,我通過Hadley的網站,書籍和例子閱讀。

第二個問題:審美上的alpha設置不能防止矩形遮擋背景。如何獲得透明度?

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

加入* DAT *爲重複性隨機定義。這是擊敗我的命令語法。我想每個geom_rect都會覆蓋最後一個,而不是像您期望的那樣進行合成。 – smci

回答

26

要繪製您的矩形,創建一個數據框,其中每行包含一個矩形的座標。這個構造適用於所有的多邊形,而不僅僅是矩形。一旦你知道這一點,很容易避免循環。

然後,不管你是否將變量映射到審美或者不是美學,都要小心。在你的情況下,你需要設置alpha爲你想要的值,所以它不構成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

美麗。可以使用*'qplot()'*完成一些或全部操作嗎? – smci

+9

最有可能的全部,但我從來沒有用'qplot'打擾過。 'ggplot'並不是真的很難學,你總是知道你會得到什麼。抱歉。 – Andrie