2013-07-19 4 views
6

Bir dizi başlangıç ​​ve hedef koordinatım var ve bunların arasında çizgi bölümleri çiziyorum. Sorun şu ki, geom_segment() ile sağlanan oklar yerine renk kullanarak çizginin yönünü belirtmek istiyorum. Yönünü belirtmek için maviye kırmızıya geçiş gibi bir şey.ggplot2 geom_segment boyunca renk geçişi()

Bunu ggplot2 ile yapmanın basit bir yolu var mı?

Örnek veriler: Şimdiye kadar

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

, ben farklı renkli çizgiler mümkün olmuştur, ama iki arasında aynı çizgi parçası ve geçiş iki renge sahip bir yol bulmuş değil noktanın numarası ile başlangıç ​​ve bitiş noktaları arasında puan demet interpolasyon ve boyama bu elde edebildi

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

bu çok kolay olacak sanmıyorum; Muhtemelen ara noktalarınızı segmentlerinize tanıtmak için bir yol bulmak zorunda kalacaksınız. http://stackoverflow.com/questions/15924159/smooth-colors-in-geom-line benzer bir soru soruyor ... –

+0

Bu, 'plotrix' paketinde temel grafiklerde uygulandı. Rhelp'te herhangi birinin bir grid-hack yayınlayıp yayınlamadığını araştırmayı deneyebilirsiniz. Bu vahşi hayvanda böyle bir hayvan gördüğümü sandım, ama özellikle yetenekli bir ggplot-hacker değilim, bu yüzden bunun için avda değilim. –

+0

Bir kesmek, bir renk geçişiyle yakın aralıklı noktaları çizmek olabilir. –

cevap

5

: yalnızca aralarında hiçbir nokta, bir başlangıç ​​ve bitiş noktasına sahip arasındaki noktaya göre bir degrade olan segment:

örnek: Aklımda hayal gibi

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

Ne yazık ki, gerçek verileri kullanıldığında, sonuç olarak zorlayıcı bakmadı!

enter image description here