[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
ます。しかし、問題があります: CODIGOINE
is はchar(5)
先頭にゼロがあるのに対し、CODINE
is 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の元のコードに関するいくつかのメモ:
OP の最初のマップ (上部の緑色のマップ) は、「私たちの地域の 30 の異なるエリア...」を識別します。これらの領域を識別するシェープファイルは見つかりませんでした。自治体ファイルでは 543 の自治体が特定されていますが、これらを 30 の地域にグループ化する方法が見つかりませんでした。さらに、温度レベル ファイルには 542 行あり、市区町村ごとに 1 行 (多かれ少なかれ) です。
OPは、自治体が境界を描くためにラインシェープファイルをインポートしていました。geom_polygon(...)
ポリゴンを描画 (および塗りつぶし) しgeom_path(...)
、境界を描画するため、これは必要ありません。