2

これを参考にして、私は 48 歳未満の地図をプロットし、レイヤーを追加して州間の流れを視覚化しようとしています。

library(ggplot2)
library(maps)
library(geosphere) # to inter-polate a given pair of (lat,long) on the globe

# load map data for the US
all_states <- map_data("state")

# plot state map
p <- ggplot() + geom_polygon( data=all_states, 
                       aes(x=long, y=lat, group = group),
                       colour="white", fill="grey10" )

# sample origin - destination lat,long pairs
geo <- structure(list(orig_lat = c(36.17, 36.17, 36.17), 
orig_lon = c(-119.7462, -119.7462, -119.7462), dest_lat = c(33.7712, 36.17, 39.0646), 
    dest_lon = c(-111.3877, -119.7462, -105.3272)), .Names = c("orig_lat", 
"orig_lon", "dest_lat", "dest_lon"), row.names = c(NA, 3L), class = "data.frame")

#> geo
#  orig_lat  orig_lon dest_lat  dest_lon
#1    36.17 -119.7462  33.7712 -111.3877
#2    36.17 -119.7462  36.1700 -119.7462
#3    36.17 -119.7462  39.0646 -105.3272

# list to hold a dataframe of interpolated points for each origin-destination pair
list_lines <- list()

# use the geosphere package's gcIntermediate function to generate 50 interpolated  
# points for each origin-destination pair
for (i in 1:3) {
  inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
                                        c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
                                        n=50, addStartEnd=TRUE))
  list_lines[i] <- list(inter)
  p <- p + geom_line( data = list_lines[[i]], aes(x = lon, y = lat), color = '#FFFFFF')
}
p

プロットを印刷しようとすると、次のようになります

p
Error in eval(expr, envir, enclos) : object 'lon' not found

これをデバッグしようとしたところ、これが機能することがわかりました

p + geom_line( data = list_lines[[1]], aes(x = lon, y = lat), color = '#FFFFFF')

しかし、2番目のリスト要素に別のレイヤーを追加するとそれが壊れますが、Rとggplotの両方に関する限られた知識で得られる限りです!

4

3 に答える 3

4

gcIntermediate異なる列名を返します(起点と終点はi = 2で同一であるため):

for (i in 1:3) {
  inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
                                        c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
                                        n=50, addStartEnd=TRUE))
  print(head(inter, n=2))
}
     lon   lat
1 -119.7 36.17
2 -119.6 36.13
      V1    V2
1 -119.7 36.17
2 -119.7 36.17
     lon   lat
1 -119.7 36.17
2 -119.5 36.24

次の行が機能するはずです。

for (i in 1:3) {
  inter <- as.data.frame(gcIntermediate(c(geo[i,]$orig_lon, geo[i,]$orig_lat), 
                                        c(geo[i,]$dest_lon, geo[i,]$dest_lat), 
                                        n=50, addStartEnd=TRUE))
  names(inter) <- c("lon", "lat")
  p <- p + geom_line(data=inter, aes(x=lon, y=lat), color='#FFFFFF')
}
于 2012-08-05T09:04:23.893 に答える
1

私が奇妙に感じるのは、経度を 2 つの異なる方法で参照していることです。つまりlong、スクリプトの最初とlon最後です。複数の geom が一緒に動作することが予想される場合は、これらの名前に一貫性を持たせる必要があります。

さらに、for ループで同一の geom を追加する必要はほとんどありません。1 つ追加するだけgeom_lineで、美学を使用してcolor複数の線を描画できます。

于 2012-08-05T08:32:49.163 に答える
0

を使用した非常に簡単な解決策がありますggplot2Rを使用してフロー マップをプロットする方法の簡単なチュートリアルがここggplot2にあります。

p + 
  geom_segment(data = geo, aes(x = orig_lon,    y = orig_lat, 
                               xend = dest_lon, yend = dest_lat,
                               color="#FFFFFF")) +  coord_equal()

ここに画像の説明を入力

于 2016-06-15T17:54:49.790 に答える