2014-02-20 9 views
6

Guter Tag,ggplot2 Zeitreihenstück mit farbcodierten Windrichtungspfeilen

Ich versuche, eine Zeitreihe Grundstück mit Pfeil Richtung zeigen Wind zu erzeugen und farbige Windgeschwindigkeit, Stärke zu zeigen. Letztlich versuche ich ein Grundstück, so etwas zu bekommen (nur ein Beispiel Bild, das ich online gefunden):

enter image description here

ich es geschafft haben, einen ähnlichen Beitrag (siehe unten) zu finden, und ich versuchte zu folgen, aber ich bin fest mit der Anzeige der Windrichtungspfeile fest.

Zurück ähnlichen Beitrag: ggplot2 wind time series with arrows/vectors

Die Codes ich zusammen bisher gesetzt haben, sind wie folgt:

require(ggplot2) 
require(scales) 
require(gridExtra) 
require(lubridate) 

dat <- data.frame(datetime = ISOdatetime(2013,08,04,0,0,0) + 
        seq(0:23)*60*60, pollutant = runif(24, 25, 75)) 

## create wind speed data 
dat$ws <- runif(nrow(dat), 0 , 15) 

## create wind direction data 
dat$wd <- runif(nrow(dat), 0 , 360) 

# define an end point for geom_segment 
dat$x.end <- dat$datetime + minutes(60) 

ggplot(data = dat, aes(x = datetime, y = pollutant)) + 
    geom_line() + 
    geom_segment(data = dat, 
       size = 1, 
       aes(x = datetime, 
        xend = x.end, 
        y = pollutant, 
        yend = wd), 
       arrow = arrow(length = unit(0.5, "cm"))) + 
    theme() 

den obigen Code verwenden ich die folgende Handlung bekommen: enter image description here

Wie Sie sehen können, startet der Plot den Pfeil, wo ich möchte, dass er startet, aber die Richtung und der Endpunkt sind zu lang und ich bin mir nicht sicher, wie ich das skalieren kann äh Pfeil mit farbcodierter Geschwindigkeit. Ich würde es sehr schätzen, wenn Sie mir sagen, wie ich das erreichen kann.

Vielen Dank, Ayan

Antwort

4

Das Grundstück Sie oben zeigen nicht die richtigen Anweisungen geben - zum Beispiel dat$wd[1] ist etwa 190 °, also wenn 0 ° einem horizontalen Pfeil nach rechts entspricht, sollte 190 ° einen nach links und leicht nach unten zeigenden Pfeil ergeben.

Um Pfeile mit der richtigen Richtung zu erhalten, müssen Sie den Kosinus und Sinus der Windrichtung zum Startpunkt Ihres Pfeils hinzufügen, um seinen Endpunkt zu definieren (siehe Code unten). Das Problem hier ist die Skalierung des Pfeils in x- und y-Richtung, weil (1) diese Achsen auf ganz anderen Skalen liegen, also die "Länge" des Pfeils nicht wirklich etwas bedeuten kann und (2) das Seitenverhältnis deines Plotting Gerät wird die visuelle Länge der Pfeile verzerren.

Ich habe eine Lösungsskizze unten geschrieben, wo ich den Versatz des Pfeils in x- und y-Richtung um 10% des Bereichs der zum Plotten verwendeten Variablen skaliere, aber dies ergibt keine Vektoren mit einheitlicher visueller Länge. In jedem Fall ist die Länge dieser Pfeile nicht gut definiert, da wiederum (a) die x- und y-Achsen unterschiedliche Einheiten darstellen und (b) das Ändern des Seitenverhältnisses der Darstellung die Längen dieser Pfeile ändert.

## arrows go from (datetime, pollutant) to 
##     (datetime, pollutant) + scaling*(sin(wd), cos(wd)) 
scaling <- c(as.numeric(diff(range(dat$datetime)))*60*60, # convert to seconds 
        diff(range(dat$pollutant)))/10 
dat <- within(dat, { 
    x.end <- datetime + scaling[1] * cos(wd/180 * pi) 
    y.end <- pollutant + scaling[2] * sin(wd/180 * pi) 
}) 


ggplot(data = dat, aes(x = datetime, y = pollutant)) + 
    geom_line() + 
    geom_segment(data = dat, 
       size = 1, 
       aes(x = datetime, 
        xend = x.end, 
        y = pollutant, 
        yend = y.end, 
        colour=ws), 
       arrow = arrow(length = unit(0.1, "cm"))) + 
scale_colour_gradient(low="green", high="red") 

Und das Seitenverhältnis Art von Verwirrungen Dinge zu ändern:

+0

Hallo Fabian, vielen Dank !! Das beantwortet meine Frage und ich kann daran arbeiten und aufbauen, wonach ich suche. Ich danke dir sehr! :) – Achak

+0

Froh, zu helfen. Sieh dir auch den Vorschlag von wibeasleys an und verbessere ihn, sein Code behandelt ausdrücklich das Seitenverhältnis, denke ich. – fabians

3

Dies ist nicht vollständig, aber ich hoffe, dass dies auch ein Start für Sie oder jemand sein wird. Verstehe ich Folgendes richtig?

  1. Der Ausgang Xs Pfeil Zeit
  2. Der Ausgang y des Pfeils
  3. Schadstoff
  4. Die Länge des Pfeils
  5. Die Orientierung der Pfeilrichtung
  6. ist
  7. die Farbe des Pfeils ist Windgeschwindingkeit
Windgeschwindingkeit ist

Wenn ja, wandelt ein fehlendes Teil von Polarkoordinaten in kartesische Koordinaten um. (zB http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html)

Das Koordinatensystem ist ein fehlender Teil, den ich nicht herausgefunden habe. Dieser Graph ist eine Mischung aus zwei Koordinatensystemen. Der Startpunkt eines Pfeils basiert auf (Zeit x Schadstoff). Aber der Vektor ist eine Polarkoordinate aus Richtung und Windgeschwindigkeit. Unter der Annahme, dass das Seitenverhältnis von (Zeit x Schadstoff) nicht 1 ist, wird eine 5 Knot-Brise von Norden eine andere Länge haben als eine 5 Knot-Brise von Südosten.

Zwei Dinge müssen angepasst werden. Einer ist das Aspektverhältnis (Zeit x Schadstoff). Die andere ist die physische Dimension des Graphen. Ich bin nicht sicher, wie ich mit dem zweiten umgehen soll, also habe ich es auf einen konstanten Wert festgelegt. Aber stellen Sie sich vor, Sie möchten etwas besser machen - wahrscheinlich, indem Sie einige zugrunde liegende Grid-Eigenschaften abfragen.

dat <- data.frame(
datetime = 0:100, 
#datetime = ISOdatetime(2013,08,04,0,0,0) + seq(0:23)*60*60, 
pollutant = 0 #Swap the next two lines for a nonuniform pollutant 
#pollutant = runif(24, 25, 75) 
) 
## convert to a numeric variable 
# dat$datetime <- 0 
# dat$datetime <- as.numeric(dat$datetime) 

#Adjust the aspect ratio 
# xrange <- range(dat$datetime) 
xlimits <- c(-5, 100) 
xrange <- diff(range(xlimits)) 
ylimits <- c(-5, 10) 
yrange <- diff(range(ylimits)) 
aspectratio <- xrange/yrange 

## create wind speed data 
dat$ws <- 1 
# dat$ws <- runif(nrow(dat), 0, 15) 

## create wind direction data 
#dat$wd_degrees <- runif(nrow(dat), 0, 360) 
dat$wd_degrees <- seq(from=0, to=360, length.out=nrow(dat)) 
dat$wd_radians <- dat$wd_degrees * (pi/180) 


## convert from polar to cartesian 
dat$xend <- aspectratio * (dat$ws * sin(dat$wd_radians)) + dat$datetime 
dat$yend <- aspectratio * (dat$ws * cos(dat$wd_radians)) + dat$pollutant 

ggplot(data = dat, aes(x = datetime, y = pollutant)) + 
geom_line() + 
geom_segment(data = dat,   
      size = 1, 
      aes(xend = xend, 
       yend = yend, 
       color = ws), 
      arrow = arrow(length = unit(0.5, "cm"))) + 
coord_fixed(xlim=xlimits, ylim=ylimits, ratio=1) + 
theme() 
+0

Nice one - gut zu sehen, wir beide konvergierten auf eine ähnliche Lösung und die gleichen Probleme. – fabians

+0

Hi Wibeasley, Ja, ich versuche, die 5 Punkte zu erreichen, die Sie erwähnt haben. Vielen Dank für die zusätzlichen Informationen, ich werde eine gute Lektüre und Nachforschung über die Punkte haben, die du heute Nacht erwähnt hast, um meinen Kopf herumzukriegen. Nochmals vielen Dank für Ihre Hilfe mit diesem:)  – Achak

0

Berechnen Sie die Richtung des Windes mit Dezimalgrad. Angenommen, Sie möchten, dass 0 Grad Norden (nach oben) ist, verwenden Sie Folgendes:

ggplot(data = dat, aes(x=datetime, y=pollutant)) + 
    geom_text(aes(angle=-wd_degrees+90), label="→")