データのお砂場(155) R言語、米国の白地図に色づけする、小ネタ、{maps}

Joseph Halfmoon

R言語の各パッケージ内のサンプルデータセットをABC順に舐めているので今回の予定は ggplot2パッケージのmidwestデータセットだったです。このデータセットを扱うにあたって「米国の各州を表す地図に色をフィルしたい」と思ったのですが、地図のクセを知らないとこれが意外と難物でした。素人老人が知識がないだけ?

※「データのお砂場」投稿順Indexはこちら

※使用させていただいている Rのversionは 4.3.1。RStudioは 2024.04.2+764 “Chocolate Cosmos” です。

Midwest demographics

今回、本当に「練習したかった」対象は ggplot2 パッケージの midwest データセットです。

Midwest demographics

実際に練習するのは次回とさせていただきますが、「米国中西部」のカウンティ(郡)毎の国政調査データのようです。ロードしたところが以下に。midwestRawData

変数もガッツリ多いです。county(郡)毎データなので、地図に色付けしてみたいところです。郡毎の色付けはこんな感じにすかね。以下は今回対象でないカリフォルニア州の郡の色分け地図をRに描いてもらったものです。califMap

しかし、郡を描く前に、まずもって Midwest という区分が米国内のどの州を表しているのか、米国地図(北米大陸の主要部のみ、アラスカとハワイは御免)上に塗りつぶしたい、と思いました。これがハマる第1歩です。

以下のコードにて midwest データベースより、対象としている州の略称を取得できます。

unique(midwest$state)

結果が以下に。midwestState

州5つなのね。よく使われる(けれど忘却力の老人は覚えていない)2文字略号で州が識別されてます。念のため略記号に対する州名列挙します。多分、米国の小学生などはそらんじているのだろうな。。。

    • IL、Illinois
    • IN、Indiana
    • MI、Michigan
    • OH、Ohio
    • WI、Wisconsin

さて、上記の5州を、以下のような米国白地図の上で塗りつぶしたい、ということなんであります。usStates

mapsパッケージ

上記の米国白地図は、mapsパッケージ内のものです。データの解説ページが以下に。

state: United States State Boundaries Map

なお、mapsパッケージには、上記の州境を描いた地図だけでなく、地球全域にわたる多数の地図データからなり、その中には米国の50州+ワシントンDC対象の、カウンティ境界の地図もあります(これ使うのはまた次回。)

mapsパッケージをインストールしていない場合は、パッケージのインストールからです。インストール後

library(maps)
data(stateMapEnv)
map('state')

上記で米国の白地図を描くことができると思います。上記の map 関数は region指定を受け付けるので、州を指定してターゲットの州(複数)のみプロットすることも可能です。この時点では、先ほど出てきた2文字の州略記号も「当然」受け付けるのでないかと勝手に想像。

 map('state', c('IL','IN'), xlim=NULL, ylim=NULL)

結果が以下に。IL_IN

イリノイ州とインディアナ州が描けました。これに気をよくして、2文字州略記号で本土の州を全て列挙したベクトルを作製して描いてみたところいけません。あれ、テキサスが無い、フロリダもない。。。 調べてみるとテキサスの場合は3文字の州略記号 Tex で反応しましたが、何に反応するんだか分けわからない州もあり。結構時間使って結局分からない州は州名をフルスペルで綴ったりして作ったベクトルが以下に。

usStatesMain<-c('AL','AR','AZ','CA','CO','CT','DC','DE','Florida','Georgia','Iowa','ID','IL','IN','Kansas','Kentucky','Louisiana','MA','MD','ME','MI','MN','MO','MS','MT','North Carolina','North Dakota','NE','NH','NJ','NM','NV','NY','OH','OK','OR','Penn','RI','South Carolina','South Dakota','Tenn','Tex','UT','Virginia','Vermont','WA','WI','West Virginia','WY')

その上、このベクトル(ABC順)の問題は、地図データベース上のインデックスとは異なる順番であることです。

結局、地図データベース側から州名を引きずり出しました。操作はこんな感じ。

statenames <- map('state', namesonly=TRUE)

結果が以下に。stateNames

ここでようやく分かったのが、ミシガン州をMIと2文字表記しても所望の結果が得られない理由です。ミシガンの場合、地理的に「上の方」と「下の方」に2分されているので、michigan:north とか指定しないとならないようです。米国の小学生は分かるのでしょうが、お惚け老人には分からんのう。

ようやく midwest 分類の5州を塗りつぶす方法が分かりました。こんな感じ。

colStates <- rep('white', length(statenames))
mw <- match(c("illinois", "indiana", "michigan:north", "michigan:south", "ohio", "wisconsin"), statenames)
colStates[mw] <- 'red'
map('state', statenames, fill=TRUE, col=colStates, xlim=NULL, ylim=NULL)

上記の結果が以下に。midWest

アパラチア山脈の西は皆西部だと。「中西部」といっても東よりの上に北よりであると。

データのお砂場(154) R言語、luv_colours、Luv色空間?{ggplot2} へ戻る