2017-12-14 3 views
1

Ich möchte die Windstärke und -richtung als Vektoren darstellen. Das Problem besteht darin, dass die für Vektoren üblichen Geome (geom_segment() oder geom_spoke()) den Winkel ändern, wenn die Achsen unterschiedliche Verhältnisse haben oder von unterschiedlicher Art sind (z. B. x = Datum, y = Höhe). Meine aktuelle Problemumgehung verwendet geom_text(label = "→", ...) pro this answer.Wie erstellt man Segmente, die Winkel in verschiedenen Seitenverhältnissen in ggplot2 beibehalten?

Das Problem ist, dass diese Lösung langsam ist und die Größe des textbasierten Pfeils nicht gut auf die Größe des Windes abgebildet wird. Wichtig ist auch, dass es aus irgendeinem Grund beim Export in PDF nicht funktioniert. Ich möchte eine Lösung basierend auf richtigen Segmenten. Wenn ich innerhalb des Aufrufs geom arbeite, weiß ich, dass ich mit den nativen Koordinaten des Plots arbeiten kann, um richtige Segmente zu zeichnen, auch wenn eine Achse eine andere Klasse als die andere hat. Mein aktueller Versuch ist dies:


library(ggplot2) 

geom_arrow2 <- function(mapping = NULL, data = NULL, stat = "identity", 
           position = "identity", na.rm = FALSE, show.legend = NA, 
           inherit.aes = TRUE, scale = 1,...) { 
    layer(geom = GeomArrow2, 
      mapping = mapping, 
      data = data, 
      stat = stat, 
      position = position, 
      show.legend = show.legend, 
      inherit.aes = inherit.aes, 
      params = list(na.rm = na.rm, scale = scale, ...) 
    ) 
} 
GeomArrow2 <- ggplot2::ggproto("GeomArrow2", Geom, 
    required_aes = c("x", "y", "mag", "angle"), 
    default_aes = ggplot2::aes(color = "black", scale = 1), 
    draw_key = draw_key_polygon, 
    draw_panel = function(data, panel_scales, coord, scale = 1) { 
     coords <- coord$transform(data, panel_scales) 

     Mmag <- max(coords$mag) 
     coords$mag <- with(coords, mag/Mmag*coords$scale) 

     coords$dx <- with(coords, cos(angle)*mag)*scale 
     coords$dy <- with(coords, sin(angle)*mag)*scale 

     pol <- grid::polylineGrob(x = c(coords$x, 
             coords$x + coords$dx), 
            y = c(coords$y, 
             coords$y + coords$dy), 
            default.units = "npc", 
            arrow = grid::arrow(angle = 15, length = unit(0.5, "lines")), 
            gp = grid::gpar(col = coords$colour), 
            id = rep(seq(nrow(coords)), 2)) 
     pol 

    }) 


field <- expand.grid(x = seq.Date(as.Date("2017-01-01"), as.Date("2017-01-31"), "2 days"), 
        y = 1:10) 
field$u <- rnorm(nrow(field)) 
field$v <- rnorm(nrow(field)) 
field$V <- with(field, sqrt(u^2 + v^2)) 
field$dir <- with(field, atan2(v, u))*180/pi 

ggplot(field, aes(x, y)) + 
    geom_point() + 
    geom_arrow2(aes(mag = V, angle = dir), scale = 0.5) 

Aber jetzt das Problem ist wieder da und verschiedene Seitenverhältnisse verzerren den tatsächlichen Winkel der Pfeile. Ich habe verschiedene Dinge versucht und herausgefunden, dass mit "snpc" Einheiten statt "npc" Winkel konserviert, aber die Position ist verschoben, so dass es nicht gut ist.

Wenn ich Informationen des Seitenverhältnisses des Grundstücks innerhalb des geom Anruf bekommen könnte, das wäre toll.

Jede Hilfe wird sehr geschätzt.

+0

was bedeutet der Winkel, wenn es um die Achsen nicht verwandt ist? – baptiste

+0

Es bedeutet die Richtung, aus der der Wind kommt. Zum Beispiel könnte ein 45 ° -Peil den Wind aus Südwesten bedeuten. –

Antwort

1

Sie Einheiten mischen,

xx <- unit.c(unit(coords$x, "npc"), 
      unit(coords$x, "npc") + unit(coords$dx, "snpc")) 
yy <- unit.c(unit(coords$y, "npc"), 
      unit(coords$y, "npc") + unit(coords$dy, "snpc")) 
pol <- grid::polylineGrob(x = xx, y = yy, 
          default.units = "npc", 
          arrow = grid::arrow(angle = 15, length = unit(0.5, "lines")), 
          gp = grid::gpar(col = coords$colour), 
          id = rep(seq(nrow(coords)), 2)) 
+0

Danke! Das scheint besser zu funktionieren, aber sehe meinen Schnitt; es sind die falschen Winkel. –

+0

Sie berechnen cos/sin (45); Winkel müssen im Bogenmaß sein – baptiste

+0

Verdammt, du hast Recht. Anfängerfehler meinerseits! –

Verwandte Themen