2012-05-12 19 views
11

Co ja tu robię źle? Próbuję cienia zamieniać 24-godzinne codzienne prostokąty z przezroczystym szarym. Ale tylko ostatni prostokąt z pętli for jest rysowany (?!?). Jeśli robię to ręcznie, zamiast przez pętlę for, to działa dobrze.ggplot2: jak przezroczysto cieniu naprzemiennie dni na działce

Czy istnieje sposób na wektoryzację tego, aby uniknąć pętli for? (I czy można to zrobić za pomocą qplot?) Jestem nowy w ggplot2 i tak, czytam stronę Hadley'a, książkę i przykłady.

Drugi numer: ustawienie alfa na estetyce nie zapobiega zamknięciu prostokątów w tle. Jak uzyskać przezroczystość?

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

Dodano losowo definicja * * DAT dla powtarzalności. To składnia poleceń, która mnie bije. Domyślam się, że każde wyrażenie geom_rect przesłania ostatnie, zamiast składać, jak można się spodziewać. – smci

Odpowiedz

26

Aby narysować prostokąty, utwórz ramkę danych, w której każdy wiersz zawiera współrzędne pojedynczego prostokąta. Ta konstrukcja działa dla wszystkich wielokątów, a nie tylko dla prostokątów. Gdy już się o tym dowiesz, możesz łatwo uniknąć pętli.

Następnie należy uważać, czy zmapować zmienną do estetyki, czy nie. W twoim przypadku musisz ustawić alpha na dowolną wartość, więc nie stanowi ona części ustawień 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

Piękny. Czy niektóre lub wszystkie mogą być wykonane za pomocą * 'qplot()' *? – smci

+9

Najprawdopodobniej wszystko, ale nigdy nie zawracałem sobie głowy "qplot". 'ggplot' nie jest trudniejszy do nauczenia i zawsze wiesz dokładnie, co dostaniesz. Przepraszam. – Andrie

Powiązane problemy