2013-07-19 15 views
6

Mam zestaw współrzędnych początku i docelowego, a ja rysuję między nimi segmenty linii. Chodzi o to, chciałbym wskazać kierunek linii używając koloru zamiast strzałek, które są dostarczane z geom_segment(). Coś w rodzaju niebieskiego przechodzącego na czerwony, aby wskazać kierunek.Kolor gradientu ggplot2 wzdłuż geom_segment()

Czy istnieje prosty sposób, aby to zrobić za pomocą ggplot2?

Przykładowe dane:

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)) 

Do tej pory nie udało się kolor linii w różny sposób, ale nie znaleziono sposób, aby mieć dwa kolory, w tym samym segmencie linii i przejściowym pomiędzy nimi, przy mam tylko punkt początkowy i końcowy, bez punktów w pomiędzy:

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

Nie sądzę, że będzie to bardzo łatwe; prawdopodobnie będziesz musiał zhakować sposób na wprowadzenie punktów pośrednich do swoich segmentów. http://stackoverflow.com/questions/15924159/smooth-colors-in-geom-line zadaje podobne pytanie ... –

+0

Zostało to zaimplementowane w podstawowej grafice w pakiecie "plotrix". Możesz spróbować przeszukać, czy ktoś opublikował siatkę-hack w Rhelp. Myślałem, że widziałem takie zwierzę na wolności, ale nie jestem szczególnie utalentowanym gpplot-hackerem, więc nie szukam tego. –

+0

Jednym z hackerów może być rysowanie blisko siebie punktów za pomocą gradientu kolorów. –

Odpowiedz

5

udało mi się to osiągnąć poprzez interpolację kilka punktów pomiędzy początkowym i końcowym z numerem punktu, a następnie barwienia segment z gradientem na podstawie liczby punktów pomiędzy:

przykład:

# 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") 

Niestety, kiedy użyłem prawdziwych danych, wynik nie wygląda równie atrakcyjnie jak wyobrażałem sobie w głowie!

enter image description here

Powiązane problemy