2016-04-08 9 views
6

Ich möchte eine Karte der Niederlande mit geschwungenen Linien zwischen den Städten machen. Ich habe zwei Datenfelder Nummer eins genannt: df_verticles, die 24 Städte mit ihrer lat/lon Kombination enthält. Der zweite Datenframe mit dem Namen: df Ich möchte eine gekrümmte Linie zwischen lat/lon von der Kombination zum lat/lon zur Kombination zeichnen.Zeichnen Sie gekrümmte Linien in ggmap, geom_curve funktioniert nicht

> head(df_vertices) 
     city AmountSessions totalkWh AmountRFID scaledAmount scaledkWh Latitude Longitude 
1 Alkmaar   13608 104554.68  1326 0.07139012 0.026941910 52.63903 4.755538 
2  Almere   11281 100841.42  930 0.05006999 0.025985067 52.39447 5.282043 
3 Amersfoort   7719 67663.30  1198 0.06449876 0.017435647 52.15108 5.383069 
4 Amstelveen   25794 236437.93  2616 0.14084204 0.060925915 52.31724 4.859266 
5 Amsterdam   402365 3880744.86  18574 1.00000000 1.000000000 52.34560 4.808834 

> head(df) 
CityChargeSessions NextCity Amount sumkWh scaledAmount scaledkWh Latitude_from Longitude_from Latitude_to Longitude_to 
1   Amsterdam Alkmaar 1058 8133.736 0.18438480 0.15480933  52.34560  4.808834 52.63903  4.755538 
2   Amsterdam  Almere 998 7254.133 0.17392820 0.13806786  52.34560  4.808834 52.39447  5.282043 
3   Amsterdam Amersfoort 566 4977.404 0.09864064 0.09473489  52.34560  4.808834 52.15108  5.383069 
4   Amsterdam Amstelveen 3724 24210.289 0.64900662 0.46079423  52.34560  4.808834 52.31724  4.859266 
5    Almere Amsterdam 1034 8685.526 0.18020216 0.16531155  52.39447  5.282043 52.34560  4.808834 
6   Amersfoort Amsterdam 579 4936.823 0.10090624 0.09396251  52.15108  5.383069 52.34560  4.808834 

Normalerweise ggmap ist nur eine Unterschicht eines ggplot so habe ich beschlossen, in ggplot zuerst meine gewünschte Grundstück Grundstück:

ggplot_curve<- ggplot()+ 
geom_text(data=df_vertices, aes(x = Longitude, y = Latitude+0.025, label = df_vertices$city), size=6)+ 
geom_point(aes(x = Longitude, y = Latitude, size=scaledkWh), colour="red", data = df_vertices, alpha =0.5)+ 
scale_size_continuous(range=c(1,30))+ 
geom_curve(data=df, aes(x=Longitude_from, y=Latitude_from, xend=Longitude_to, yend=Latitude_to), 
        arrow=arrow(angle=15,ends="first",length=unit(0.7,"cm"),type="closed"), size= df$scaledAmount,alpha=0.5, curvature = 0.15)+ 
theme_bw() 

enter image description here

Das ist genau das, was ich will, ich jetzt nur möchte die gewünschte ggmap als Unterschicht hinzufügen.

Jetzt nur ersetzen ggplot i() durch ggmap

ggmap_with_curve<- ggmap(map)+ 
geom_point(aes(x = Longitude, y = Latitude, size=scaledkWh), colour="red", data = df_vertices, alpha =0.5)+ 
scale_size_continuous(range=c(1,30))+ 
geom_curve(data=df, aes(x=Longitude_from, y=Latitude_from, xend=Longitude_to, yend=Latitude_to), 
     arrow=arrow(angle=15,ends="first",length=unit(0.7,"cm"),type="closed"), size= df$scaledAmount,alpha=0.5, curvature = 0.15) 

enter image description here

Wie Sie dies nicht sehen können, die gewünschte Ausgabe i gehofft hatte, gab R mir diese Fehlermeldung:

geom_curve ist nicht für nichtlineare Koordinaten implementiert.

Ich habe versucht, es zu googlen, aber ich würde es selbst reparieren.

Also meine Frage, wie bekomme ich diese ggplot Ausgabe mit der gewünschten Karte als Unterschicht. Kann mir jemand helfen?

+0

Es scheint, wie Sie stecken könnten Ihre Karte mit Ihren eigenen geografischen Daten mit einem projizierten, linearen Koordinatensystem zu machen. Es sei denn, jemand kennt eine andere Problemumgehung. Dazu müssen die gewünschten Basisdateien erstellt und in ein lineares 2D-System projiziert werden, das für Ihre Anzeige geeignet ist (minimiert Verzerrungen auf die von Ihnen gewünschte Weise) und [base ggplot2] verwendet (https://github.com/hadley/ggplot2)/wiki/Plotten-Polygon-Shapefiles) Funktionen zum Erstellen der Karte. –

Antwort

4

Ich denke mit coord_cartesian() geben Sie, was Sie wollen. Mit den 5 Reihen zeigte in Ihrem Beitrag

map <- get_map(location = "Amsterdam", zoom = 11) 
ggmap(map) + 
    geom_point(data = df_vertices, 
      aes(x = Longitude, y = Latitude, size = scaledkWh), 
      colour = "red", alpha =0.5) + 
geom_curve(data = df, 
      aes(x = Longitude_from, y = Latitude_from, xend = Longitude_to, yend = Latitude_to),  
      arrow = arrow(angle = 15, ends = "first", length = unit(0.5, "cm"), type = "closed"), 
      size = df$scaledAmount, alpha = 0.5, curvature = 0.15, inherit.aes = TRUE) 
scale_size_continuous(range=c(1,30)) + 
coord_cartesian() 

enter image description here

+0

Danke! @Mlavoie –

+0

schlägt mit größeren Karten (sagen wir, Europa) - Nichtlinearität wird sehr groß. – Valentas

+0

@Valentas, vielleicht könnten Sie Ihre Frage mit Ihren eigenen Daten posten und genau erklären, was das Problem ist. – MLavoie