2016-04-08 32 views
6

Mi piacerebbe fare una mappa dei Paesi Bassi con linee curve tra le città. Ho due dataframes numero uno chiamato: df_verticles che contiene 24 città con la loro combinazione lat/lon. Il secondo dataframe chiamato: df voglio usare per tracciare una linea curva tra lat/lon dalla combinazione alla lat/lon alla combinazione.Disegna linee curve in ggmap, geom_curve non funziona

> 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 

Normalmente ggmap è solo un sottostrato di un ggplot così ho deciso di tracciare la mia trama desiderata prima in ggplot:

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

Questo è esattamente quello che voglio, ora ho appena vuoi aggiungere la ggmap desiderata come sottostrato.

Ora devo solo sostituire ggplot() da 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

Come potete vedere questo non è il risultato desiderato ho sperato, R mi ha dato questo messaggio di errore:

geom_curve non è implementato per le coordinate non lineari.

Ho provato a google, ma non ho risolto il problema.

Quindi la mia domanda come ottengo questo output ggplot con la mappa desiderata come sottostrato. Qualcuno può aiutarmi?

+0

sembra che si potrebbe essere bloccato rendere la vostra mappa utilizzando i propri dati geografici con una proiezione lineare sistema di coordinate. A meno che qualcuno non conosca una soluzione alternativa diversa? Ciò comporterebbe la creazione dei file di base che desideri e la loro proiezione in un sistema lineare 2D che funzioni per il tuo schermo (minimizza la distorsione nei modi che desideri) e usando [base ggplot2] (https://github.com/hadley/ggplot2/wiki/plotting-polygon-shapefiles) funzioni per creare la mappa. –

risposta

4

Penso che usando coord_cartesian() darti quello che vuoi. Utilizzando le 5 righe mostrato nel tuo post

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

Grazie! @Mlavoie –

+0

non riesce con le mappe più grandi (ad esempio, Europa) - la non-linearità diventa molto grande. – Valentas

+0

@Valentas, forse potresti pubblicare la tua domanda con i tuoi dati spiegando esattamente qual è il problema. – MLavoie