2013-07-19 9 views
6

私は原点と目的地の座標を持っており、それらの間に線分を描いています。問題は、geom_segment()で提供されている矢印の代わりに、色を使って線の方向を示すことです。青を赤に変えて方向を示すようなもの。ggplot2 geom_segment()に沿った色勾配

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

、私は異なる色の線ことができたが、私は2つの間で同じ線分と遷移上の2つの色を有するようにする方法を発見していません私はポイント数で始点と終点間にポイントの束を補間して、着色することによって、これを達成することができました

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-hackerではないので、私はこの動物の狩猟にはいない。 –

+0

ハックの1つは、間隔の狭い点を色のグラデーションでプロットすることです。 –

答えて

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

関連する問題