2013-07-19 15 views
6

Ho un set di coordinate di origine e destinazione e disegno segmenti di linea tra di loro. Il fatto è che vorrei indicare la direzione della linea usando il colore al posto delle frecce fornite con geom_segment(). Qualcosa come il blu che si trasforma in rosso, per indicare la direzione.gradiente di colore ggplot2 lungo geom_segment()

C'è un modo semplice per farlo con ggplot2?

dati Esempio:

points <- data.frame(long=runif(100,-122.4154,-122.3491)) 
points$lat <- runif(100,37.5976,37.6425) 
points$long2 <- runif(100,-122.4154,-122.3491) 
points$lat2 <- runif(100,37.5976,37.6425) 

# add distance 
library(geosphere) 
points$miles <- apply(points, 1, 
    function(x) distHaversine(p1=c(x["long"],x["lat"]),p2=c(x["long2"],x["lat2"]),r=3959)) 

Finora, sono stato in grado di linee di colore diverso, ma non ho trovato un modo per avere due colori sullo stesso segmento di linea e di transizione tra i due, quando ho solo un punto di inizio e di fine, senza punti tra:

ggplot(points,aes(x=long,xend=long2,y=lat,yend=lat2,color=miles)) + 
    geom_segment() + 
    scale_color_gradient2(low="red",high="blue",midpoint=median(points$miles)) 
+1

Non credo che questo sta per essere molto semplice; probabilmente dovrai inventare un modo per introdurre punti intermedi nei tuoi segmenti. http://stackoverflow.com/questions/15924159/smooth-colors-in-geom-line fa una domanda simile ... –

+0

Questo è stato implementato nella grafica di base nel pacchetto 'plotrix'. Potresti provare a cercare se qualcuno ha pubblicato una griglia in Rhelp. Pensavo di aver visto un tale animale in natura, ma non sono un abile hacker particolarmente abile quindi non sono nella caccia di questo. –

+0

Una modifica potrebbe essere quella di tracciare punti ravvicinati con sfumature di colore. –

risposta

5

ho potuto ottenere questo interpolando un gruppo di punti tra i punti iniziale e finale con il numero di punti, e quindi colorare la segmentare con un gradiente in base al numero del punto in mezzo:

esempio:

# generate data points 
points <- data.frame(long=runif(100,-122.4154,-122.3491)) 
points$lat <- runif(100,37.5976,37.6425) 
points$long2 <- runif(100,-122.4154,-122.3491) 
points$lat2 <- runif(100,37.5976,37.6425) 

# function returns a data frame with interpolated points in between start and end point 
interp_points <- function (data) { 

    df <- data.frame(line_id=c(),long=c(),lat=c()) 

    for (i in 1:nrow(data)) { 

    line <- data[i,] 

    # interpolate lats and longs in between the two 
    longseq <- seq(
        as.numeric(line["long"]), 
        as.numeric(line["long2"]), 
        as.numeric((line["long2"] - line["long"])/10) 
       ) 
    latseq <- seq(
        as.numeric(line["lat"]), 
        as.numeric(line["lat2"]), 
        as.numeric(line["lat2"] - line["lat"])/10 
       ) 

    for (j in 1:10) { 
     df <- rbind(df,data.frame(line_id=i,long=longseq[j],lat=latseq[j],seg_num=j)) 
    } 
    } 

    df 
} 

# run data through function 
output <- interp_points(points) 

# plot the output 
ggplot(output,aes(x=long,y=lat,group=line_id,color=seg_num)) + 
    geom_path(alpha=0.4,size=1) + 
    scale_color_gradient(high="red",low="blue") 

Purtroppo, quando ho usato i dati reali, il risultato non ha guardare validi come stavo immaginando nella mia mente!

enter image description here

Problemi correlati