2012-05-12 7 views
11

Was mache ich hier bitte falsch? Ich versuche, 24-Stunden-Tagesrechtecke mit transparentem Grau zu schattieren. Aber nur das letzte Rechteck aus der for-Schleife wird gezeichnet (?!?) Wenn ich Dinge manuell anstelle von for-Schleife mache, funktioniert es gut.ggplot2: wie man abwechselnde Tage auf einer Handlung transparent schattiert

Gibt es eine Möglichkeit, dies zu vektorisieren, um die For-Schleife zu vermeiden? (Und kann es mit qplot getan werden?) Ich bin neu in ggplot2 und ja, ich lese durch Hadleys Website, Buch und Beispiele.

Zweites Problem: Die Alpha-Einstellung auf die Ästhetik verhindert nicht, dass die Rechtecke den Hintergrund verdecken. Wie bekomme ich Transparenz?

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

Hinzugefügt zufällige Definition * dat * für die Reproduzierbarkeit. Es ist die Befehlssyntax, die mich schlägt. Ich nehme an, dass jeder geom_rect den letzten überschreibt, anstatt wie gewohnt zu komponieren. – smci

Antwort

26

Um Ihre Rechtecke zu zeichnen, erstellen Sie einen Datenrahmen, in dem jede Zeile die Koordinaten für ein einzelnes Rechteck enthält. Dieses Konstrukt funktioniert für alle Polygone, nicht nur für Rechtecke. Sobald Sie das wissen, ist es einfach, die Schleife zu vermeiden.

Dann seien Sie vorsichtig, ob Sie eine Variable einer Ästhetik zuordnen oder nicht. In Ihrem Fall müssen Sie den Wert alpha auf den von Ihnen gewünschten Wert einstellen, damit er nicht zu den aes() Einstellungen gehört.

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

Schön. Kann etwas oder alles mit * 'qplot()' * gemacht werden? – smci

+9

Höchstwahrscheinlich alles, aber ich habe mich nie mit 'qplot' beschäftigt. 'ggplot' ist nicht wirklich schwieriger zu lernen, und Sie wissen immer genau, was Sie bekommen werden. Es tut uns leid. – Andrie

Verwandte Themen