5

ラスターファイル「airtemp」とポリゴンシェープファイル「大陸」があります。「airtemp」に「continents」を重ねたいので、「airtemp」の上に「continents」の境界が見えます。ラスターファイルをlevelplot(格子)でプロットします。readShapeSpatial最初に (maptools)でポリゴンを読み取り、次にplot.

問題はlevelplot、 とplotスケールが異なることです。Plotフレームが小さい傾向にあります。申し訳ありませんが、再現可能なサンプルがありませんが、これは地球物理学者にとってかなり一般的な問題だと思います. ここで同様の質問を見つけました:

http://r.789695.n4.nabble.com/overlaying-a-levelplot-on-a-map-plot-td2019419.html

しかし、私は解決策をよく理解していません。

4

2 に答える 2

12

パッケージの+.trellisおよびlayer 関数を使用してシェープファイルをオーバーレイできます (これは で自動的にロードされます)。latticeExtrarasterVis

library(raster)
library(rasterVis)

遊ぶためのデータを作ってみましょう。ラスター ファイルとシェープファイルが既にある場合は、この部分をスキップできます。

library(maps)
library(mapdata)
library(maptools)

## raster
myRaster <- raster(xmn=-100, xmx=100, ymn=-60, ymx=60)
myRaster <- init(myRaster, runif)

## polygon shapefile
ext <- as.vector(extent(myRaster))

boundaries <- map('worldHires', fill=TRUE,
    xlim=ext[1:2], ylim=ext[3:4],
    plot=FALSE)

## read the map2SpatialPolygons help page for details
IDs <- sapply(strsplit(boundaries$names, ":"), function(x) x[1])
bPols <- map2SpatialPolygons(boundaries, IDs=IDs,
                              proj4string=CRS(projection(myRaster)))

ここで、ラスター ファイルを でプロットしrasterVis::levelplot、シェープファイルを でプロットしsp::sp.polygons、全体のグラフィックを+.trellisおよびで作成しlayerます。

levelplot(myRaster) + layer(sp.polygons(bPols))

透明色で重ねる

sp.polygonsのデフォルトとして透明色を使用しますfillが、変更できます。

levelplot(myRaster) + layer(sp.polygons(bPols, fill='white', alpha=0.3))

白色で重ねる

于 2013-08-21T11:35:07.530 に答える
1

このディスカッションに従って、これを行う 1 つの方法があります。これは、SpatialPolygonsDataFrame を、NA で区切られたポリゴン座標の 1 つのマトリックスに分割することで構成されます。次に、これを を使用してレベルプロットにプロットしpanel.polygonます。

library(maptools)
a <- matrix(rnorm(360*180),nrow=360,ncol=180) #Some random data (=your airtemp)
b <- readShapeSpatial("110-m_land.shp") #I used here a world map from Natural Earth.

ここからが楽しみの始まりです。

lb <- as(b, "SpatialPolygons")
llb <- slot(lb, "polygons")
B <- lapply(llb, slot, "Polygons") #At this point we have a list of SpatialPolygons
coords <- matrix(nrow=0, ncol=2)
for (i in seq_along(B)){
    for (j in seq_along(B[[i]])) {
        crds <- rbind(slot(B[[i]][[j]], "coords"), c(NA, NA)) #the NAs are used to separate the lines
        coords <- rbind(coords, crds)
        }
    }
coords[,1] <- coords[,1]+180 # Because here your levelplot will be ranging from 0 to 360°
coords[,2] <- coords[,2]+90 # and 0 to 180° instead of -180 to 180 and -90 to 90

そして、プロットが来ます:

levelplot(a, panel=function(...){
                        panel.levelplot(...)
                        panel.polygon(coords)})

ラティスの考え方は、引数でプロット関数を定義することですpanel(この件に関する完全な説明については、を参照?xyplotしてください)。levelplot 自体の関数はlevelplot.

ここに画像の説明を入力

もちろん、あなたの場合、baseグラフィックスを使用してこれをプロットする方が簡単に思えます:

image(seq(-180,180,by=1),seq(-90,90,by=1),a)
plot(b, add=TRUE)

ここに画像の説明を入力

于 2013-07-12T07:03:41.230 に答える