2013-07-19 185 views
6

我有一組原點和目標座標,我在它們之間繪製線段。事情是,我想用顏色來代替線條的方向,而不是geom_segment()提供的箭頭。像藍色過渡到紅色,以指示方向。沿着geom_segment()的ggplot2顏色漸變()

有沒有簡單的方法來做到這一點與ggplot2?

示例數據:

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

到目前爲止,我已經能夠彩色線條不同,但我還沒有找到一種方法來對兩個時之間的相同線段和過渡兩種顏色我只有一個起點和終點,沒有點之間:

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

我不認爲這會很容易;您可能不得不採取一種方法將中間點引入您的細分受衆羣。 http://stackoverflow.com/questions/15924159/smooth-colors-in-geom-line問一個類似的問題...... –

+0

這是在'plotrix'包中的基本圖形中實現的。您可以嘗試搜索,看看是否有人在Rhelp上發佈過網格黑客。我以爲我曾經在野外看到過這樣的動物,但我不是一個特別熟練的ggplot黑客,所以我不在尋找這種動物。 –

+0

一個黑客可能會用顏色漸變來繪製緊密間隔的點。 –

回答

5

我能夠通過在起點和終點之間插一束點與點的號碼,然後着色來實現這一使用基於點之間的點數的漸變線段:

例如:

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

不幸的是,當我用真實的數據,結果沒有,因爲我是在我的腦海中想象它看起來引人注目!

enter image description here