8

私は ggplot に比較的慣れていないので、私の問題のいくつかが本当に単純であるか、まったく解決できない場合は、ご容赦ください。

私がやろうとしているのは、形状の塗りつぶしが連続している国の「ヒート マップ」を生成することです。さらに、国の形をしてい.RDataます。Hadley wickham のスクリプトを使用して、SpatialPolygon データをデータ フレームに変換しました。データ フレームの long と lat のデータは次のようになります

head(my_df)
long        lat         group
6.527187    51.87055    0.1 
6.531768    51.87206    0.1
6.541202    51.87656    0.1
6.553331    51.88271    0.1

この緯度経度データは、ドイツの輪郭を描きます。残りのデータ フレームは必要ないと思うのでここでは省略します。特定の経度/緯度点の値の 2 番目のデータ フレームもあります。これはこのように見えます

my_fixed_points
long        lat         value
12.817      48.917      0.04 
8.533       52.017      0.034
8.683       50.117      0.02
7.217       49.483      0.0542

私が今やりたいことは、そのポイントから特定の距離内にあるすべての固定ポイントの平均値に従って、マップの各ポイントに色を付けることです。そうすれば、国の地図全体を (ほぼ) 連続して塗りつぶすことができます。私がこれまでに持っているのは、ggplot2 でプロットされた国の地図です。

ggplot(my_df,aes(long,lat)) + geom_polygon(aes(group=group), fill="white") + 
geom_path(color="white",aes(group=group)) + coord_equal()

私の最初のアイデアは、描画されたマップ内にあるポイントを生成し、生成されたすべてのポイントの値を次のmy_generated_pointように計算することでした

value_vector <- subset(my_fixed_points, 
  spDistsN1(cbind(my_fixed_points$long, my_fixed_points$lat),  
  c(my_generated_point$long, my_generated_point$lat), longlat=TRUE) < 50, 
  select = value)
point_value <- mean(value_vector)

ただし、これらのポイントを生成する方法は見つかりませんでした。そして、問題全体と同様に、この方法で解決できるかどうかさえわかりません。私の質問は、これらのポイントを生成する方法が存在するかどうか、および/または解決策に到達する別の方法があるかどうかです。

解決

ポールのおかげで、私はほとんど欲しいものを手に入れることができました。オランダのサンプル データの例を次に示します。

library(ggplot2)
library(sp)
library(automap)
library(rgdal)
library(scales)

#get the spatial data for the Netherlands
con <- url("http://gadm.org/data/rda/NLD_adm0.RData")
print(load(con))
close(con)

#transform them into the right format for autoKrige
gadm_t <- spTransform(gadm, CRS=CRS("+proj=merc +ellps=WGS84"))

#generate some random values that serve as fixed points
value_points <- spsample(gadm_t, type="stratified", n = 200)
values <- data.frame(value = rnorm(dim(coordinates(value_points))[1], 0 ,1))
value_df <- SpatialPointsDataFrame(value_points, values)

#generate a grid that can be estimated from the fixed points
grd = spsample(gadm_t, type = "regular", n = 4000)
kr <- autoKrige(value~1, value_df, grd)
dat = as.data.frame(kr$krige_output)

#draw the generated grid with the underlying map
ggplot(gadm_t,aes(long,lat)) + geom_polygon(aes(group=group), fill="white") + geom_path(color="white",aes(group=group)) + coord_equal() + 
geom_tile(aes(x = x1, y = x2, fill = var1.pred), data = dat) + scale_fill_continuous(low = "white", high = muted("orange"), name = "value")

autoKrige オランダ

4

2 に答える 2

15

あなたが望むのは、これらの線に沿ったものだと思います。この自作は大規模なデータセットでは非常に非効率になると予測していますが、小さなサンプル データセットでは機能します。カーネル密度と、おそらくrasterパッケージを調べます。でもこれが似合ってるかも…

次のコード スニペットは、元のポイント データセットをオーバーレイするポイントのグリッドのカドミウム濃度の平均値を計算します。1000 m より近いポイントのみが考慮されます。

library(sp)
library(ggplot2)
loadMeuse()

# Generate a grid to sample on
bb = bbox(meuse)
grd = spsample(meuse, type = "regular", n = 4000)
# Come up with mean cadmium value
# of all points < 1000m.
mn_value = sapply(1:length(grd), function(pt) {
  d = spDistsN1(meuse, grd[pt,])
  return(mean(meuse[d < 1000,]$cadmium))
})

# Make a new object
dat = data.frame(coordinates(grd), mn_value)
ggplot(aes(x = x1, y = x2, fill = mn_value), data = dat) + 
   geom_tile() + 
   scale_fill_continuous(low = "white", high = muted("blue")) + 
   coord_equal()

これにより、次の画像が得られます。

ここに画像の説明を入力

別のアプローチは、補間アルゴリズムを使用することです。その一例がクリギングです。これは、 automap パッケージを使用すると非常に簡単です (自己プロモーションを見つけてください:)、私はパッケージを書きました):

library(automap)
kr = autoKrige(cadmium~1, meuse, meuse.grid)
dat = as.data.frame(kr$krige_output)

ggplot(aes(x = x, y = y, fill = var1.pred), data = dat) + 
   geom_tile() + 
   scale_fill_continuous(low = "white", high = muted("blue")) + 
   coord_equal()

これにより、次の画像が得られます。

ここに画像の説明を入力

ただし、このマップであなたが何を目指しているのかを知らなければ、あなたが何を望んでいるのかを正確に理解することは困難です.

于 2011-12-19T15:41:03.703 に答える
2

このスライドショーは別のアプローチを提供します。アプローチの説明については18 ページを、スライド作成者にとって結果がどのように見えるかについては21 ページを参照してください。

ただし、スライド メーカーspplotは、ggplot2 とそのプロット関数ではなく、sp パッケージと関数を使用したことに注意してください。

于 2011-12-20T07:43:33.877 に答える