11

私たちは毎日、私たちの地域の 30 の異なるエリアの計算された温度レベルを示すマップを作成します。各エリアは、レベルに応じて異なる色で塗りつぶされます。このマップは次のようになります

ここに画像の説明を入力

ここで、マップ生成を R に切り替えたいと思います。州と市の境界をダウンロードし (スペイン全体の境界、またはここで私の地域のサブセットを見つけることができます)、Hadley のに従って ggplot2 でそれらをプロットすることができました。

識別子 (CODINE) と日次レベルの 2 つの列を含む ASCII ファイルを作成することもできます。ここからダウンロードできます。

これは、R と ggplot2 を使用してシェープファイルをプロットしようとする最初のスクリプトであるため、間違いがある可能性があり、改善できることを確認してください。提案を歓迎します。次のコード(Hadleyの前述に基づく)は私にとってはうまくいきます:

> require("rgdal")
> require("maptools")
> require("ggplot2")
> require("plyr")

# Reading municipal boundaries

esp = readOGR(dsn=".", layer="lineas_limite_municipales_etrs89")

muni=subset(esp, esp$PROV1 == "46" | esp$PROV1 == "12" | esp$PROV1 == "3")
muni@data$id = rownames(muni@data)
muni.points = fortify(muni, region="id")
muni.df = join(muni.points, muni@data, by="id")

# Reading province boundaries

prov = readOGR(dsn=".", layer="poligonos_provincia_etrs89")

pr=subset(prov, prov$CODINE == "46" | prov$CODINE == "12" | prov$CODINE == "03" )
pr@data$id = rownames(pr@data)
pr.points = fortify(pr, region="id")
pr.df = join(pr.points, pr@data, by="id")

ggplot(muni.df) + aes(long,lat,group=group) + geom_path(color="blue") +
+ coord_equal()+ geom_path(data=pr.df, + 
aes(x=long, y=lat, group=group),color="red", size=0.5) 

このコードは、すべての境界を含む素敵なマップをプロットしますここに画像の説明を入力

レベルごとにポリゴンを塗りつぶすために、 http://tormodboe.wordpress.com/2011/02/22/g%C3%B8y-med-kart-2/で提案されているように、読み取りとマージを試みました

level=read.csv("levels.dat",header=T,sep="")
munlevel=merge(muni.df,level,by="CODINE")

しかし、それはエラーを与えます

エラー en fix.by(by.x, x) : 'by' は一意に有効な列を指定する必要があります

私はシェープファイルに精通していません。おそらく、両方のデータセットをマージするための正しい選択を見つけるために、shp データ属性についてさらに学ぶ必要があります。ライン (地方自治体の境界線) をプロットしてレベルで塗りつぶすために、データをマージするにはどうすればよいですか?

4

1 に答える 1

18

[NB: この質問は 1 か月以上前に出されたものなので、OP はおそらく問題を解決する別の方法を見つけたでしょう。この関連する質問に取り組んでいるときに偶然見つけました。この回答は、他の誰かに役立つことを期待して含まれています。]

これは、OPが求めているもののようです...

...そして、次のコードで作成されました:

require("rgdal")
require("maptools")
require("ggplot2")
require("plyr")

# read temperature data
setwd("<location if your data file>")
temp.data        <- read.csv(file = "levels.dat", header=TRUE, sep=" ", na.string="NA", dec=".", strip.white=TRUE)
temp.data$CODINE <- str_pad(temp.data$CODINE, width = 5, side = 'left', pad = '0')

# read municipality polygons
setwd("<location of your shapefile")
esp     <- readOGR(dsn=".", layer="poligonos_municipio_etrs89")
muni    <- subset(esp, esp$PROVINCIA == "46" | esp$PROVINCIA == "12" | esp$PROVINCIA == "3")
# fortify and merge: muni.df is used in ggplot
muni@data$id <- rownames(muni@data)
muni.df <- fortify(muni)
muni.df <- join(muni.df, muni@data, by="id")
muni.df <- merge(muni.df, temp.data, by.x="CODIGOINE", by.y="CODINE", all.x=T, a..ly=F)
# create the map layers
ggp <- ggplot(data=muni.df, aes(x=long, y=lat, group=group)) 
ggp <- ggp + geom_polygon(aes(fill=LEVEL))         # draw polygons
ggp <- ggp + geom_path(color="grey", linestyle=2)  # draw boundaries
ggp <- ggp + coord_equal() 
ggp <- ggp + scale_fill_gradient(low = "#ffffcc", high = "#ff4444", 
                                 space = "Lab", na.value = "grey50",
                                 guide = "colourbar")
ggp <- ggp + labs(title="Temperature Levels: Comunitat Valenciana")
# render the map
print(ggp)

説明:

を使用して R にインポートされたシェープファイルreadOGR(...)はタイプSpacialDataFrameであり、2 つの主要なセクションがあります。各ポリゴン上のすべてのポイントの座標を含むプロイゴンセクションと、各ポリゴンに関する情報を含むデータセクション (つまり、ポリゴンごとに 1 行) です。muni@polygonsこれらは、およびを使用して参照できますmuni@data。ユーティリティ関数fortify(...)は、ポリゴン セクションを でプロットするために編成されたデータ フレームに変換しggplotます。したがって、基本的なワークフローは次のとおりです。

[1] Import temperature data file (temp.data)
[2] Import polygon shapefile of municipalities (muni)
[3] Convert muni polygons to a data frame for plotting (muni.df <- fortify(...))
[4] Join columns from muni@data to muni.df
[5] Join columns from temp.data to muni.df
[6] Make the plot

結合は共通のフィールドで行う必要があり、ここで問題のほとんどが発生します。元のシェープファイルの各ポリゴンには、一意の ID 属性があります。fortify(...)シェープファイルで実行するとid、これに基づく列 が作成されます。しかし、データ セクションには ID 列がありません。代わりに、ポリゴン ID は行名として格納されます。したがって、最初に次のようにid列を追加する必要があります。muni@data

muni@data$id <- rownames(muni@data)

idフィールドがmuni@dataあり、対応するidフィールドがmuni.dfにあるので、結合を行うことができます。

muni.df <- join(muni.df, muni@data, by="id")

マップを作成するには、気温レベルに基づいて塗りつぶしの色を設定する必要があります。LEVELそのためには、列を からtemp.dataに結合する必要がありますmuni.df。自治体を識別するtemp.dataフィールドがあります。CODINEまた、現在、対応するフィールドCODIGOINEが にありmuni.dfます。しかし、問題があります: CODIGOINEis はchar(5)先頭にゼロがあるのに対し、CODINEis integer は先頭にゼロがないことを意味します (Excel からインポートされたのでしょうか?)。したがって、これら 2 つのフィールドを結合するだけでは一致しません。最初に先頭にゼロを付けてCODINE変換する必要があります。char(5)

temp.data$CODINE <- str_pad(temp.data$CODINE, width = 5, side = 'left', pad = '0')

temp.datこれで、対応するフィールドにmuni.df基づいて結合できます。

muni.df <- merge(muni.df, temp.data, by.x="CODIGOINE", by.y="CODINE", all.x=T, a..ly=F)

結合フィールドの名前が異なり、同じ名前にする必要があるため、merge(...)代わりに使用します。(ただし、これはより高速であり、可能であれば使用する必要があります)。最後に、ポリゴンをプロットするためのすべての情報と、各ポリゴンの塗りつぶしの色を確立するために使用できる温度を含むデータ フレームがあります。join(...)join(...)join(...)LEVEL

OPの元のコードに関するいくつかのメモ:

  1. OP の最初のマップ (上部の緑色のマップ) は、「私たちの地域の 30 の異なるエリア...」を識別します。これらの領域を識別するシェープファイルは見つかりませんでした。自治体ファイルでは 543 の自治体が特定されていますが、これらを 30 の地域にグループ化する方法が見つかりませんでした。さらに、温度レベル ファイルには 542 行あり、市区町村ごとに 1 行 (多かれ少なかれ) です。

  2. OPは、自治体が境界を描くためにラインシェープファイルをインポートしていました。geom_polygon(...)ポリゴンを描画 (および塗りつぶし) しgeom_path(...)、境界を描画するため、これは必要ありません。

于 2013-12-09T16:13:59.777 に答える