地図に色づけする方法を学ぶ。
一般に、色はビジュアル化に重要である。
ここまでは、色は "red" や "blue" のような名前を用いて指定してきた。
R で使える657色の名前をすべて見るために、colors() 関数の出力を見る。
## [1] "white" "aliceblue" "antiquewhite" "antiquewhite1"
## [5] "antiquewhite2" "antiquewhite3"
## [1] 657
R はこれよりもずっと多くの色を生成することができる。
生成可能な色の全範囲からある色を生成するには、16進数カラーコード (hexadecimal color code) を用いることができる。
16進数は基数が16で、0から15までの値を表す整数0-9と英文字A-Fによる記数法。
16進数カラーコードはハッシュマーク (#) で始まる6文字の並び。
2桁ずつで三原色 (Red, Green, Blue: RGB) の各色の強さ(彩度)を表し、それぞれが0から255(すなわち\(2^8\)段階のいずれか)の値をとる。
例えば、紫色は半分の強さの赤と青 RGB = (127, 0, 127) によって生み出される。
127は16進法では7Fに等しいので、#7F007F という16進数カラーコードが導かれる。
R では、rgb() 関数によって数値から16進数カラーコードを作成することができる。
3つの引数 red, green, blue は各色の彩度で0から1の値をとり、0から255までの整数値に変換され、16進数で表示される。
まずは原色から始める。
red <- rgb(red = 1, green = 0, blue = 0) # 赤
green <- rgb(red = 0, green = 1, blue = 0) # 緑
blue <- rgb(red = 0, green = 0, blue = 1) # 青
c(red, green, blue) # 結果## [1] "#FF0000" "#00FF00" "#0000FF"
black <- rgb(red = 0, green = 0, blue = 0) # 黒
white <- rgb(red = 1, green = 1, blue = 1) # 白
c(black, white) # 結果## [1] "#000000" "#FFFFFF"
rgb() 関数の各引数は2以上の長さのベクトルを撮ることができ、一度に2つ以上のカラーコードを作成できる。
紫(50%の赤と50%の青)と黄色(100%の赤と100%の緑)は次のように作ることができる。
## [1] "#800080" "#FFFF00"
16進数カラーコードの最後に00からFFまでの2桁を足すことで透過色にでき、透過度もコントロールできる。
rgb() 関数の4番目の引数 alpha に0から1の彩度の尺度を指定し、16進数カラーコードに変換する。
## 透過色の青
blue.trans <- rgb(red = 0, green = 0, blue = 1, alpha = 0.5)
## 透過色の黒
black.trans <- rgb(red = 0, green = 0, blue = 0, alpha = 0.5) 16進数カラーがわかれば、"red" や "blue" のようなすでに名前のつけられている色を用いた時と同じように、それらを(文字オブジェクトとして)作図に用いることができる。
次の図では、透過色の円は重なり合ったときでも容易に識別できるが、不透過色の円同士は識別しにくいことがわかる。
## 不透過色の円は識別しにくい
plot(x = c(1, 1), y = c(1, 1.2), xlim = c(0.5, 4.5), ylim = c(0.5, 4.5),
pch = 16, cex = 5, ann = FALSE, col = black)
points(x = c(3, 3), y = c(3, 3.2), pch = 16, cex = 5, col = blue)
## 透過色にすると識別しやすい
points(x = c(2, 2), y = c(2, 2.2), pch = 16, cex = 5, col = black.trans)
points(x = c(4, 4), y = c(4, 4.2), pch = 16, cex = 5, col = blue.trans) plot() 関数の引数 ann を FALSE に設定して、デフォルトで表示される軸ラベルを消している。R でどのように色が表示されるかわかったので、地図を色づけする。
例として、2008年の大統領選挙の結果を用いて、アメリカ合衆国の地図を色づけする。
選挙データファイル pres08.csv に含まれる変数の名前と説明は次の通りである。
| 変数 | 説明 |
|---|---|
state |
州の略称 |
state.name |
省略されていない州名 |
Obama |
オバマの得票率(パーセンテージ) |
McCain |
マケインの得票率(パーセンテージ) |
EV |
その州の選挙人票の数 |
オバマが勝利した州に青を、マケインが勝利した州に赤を用いる。
RGBのカラースキームでは青と赤の混合比によって様々な色調の紫が作成できることを活用して、2大政党の得票率を計算し、青の彩度を民主党の2大政党間の得票率として、赤の彩度を共和党の得票率として設定する。
library(maps)
pres08 <- read.csv("pres08.csv")
## 2大政党の得票率
pres08$Dem <- pres08$Obama / (pres08$Obama + pres08$McCain)
pres08$Rep <- pres08$McCain / (pres08$Obama + pres08$McCain)
## カリフォルニア州への彩色
cal.color <- rgb(red = pres08$Rep[pres08$state == "CA"],
blue = pres08$Dem[pres08$state == "CA"],
green = 0)次に、カリフォルニア州の地図を2つのやり方で色づけする。
地図に色を加えるには引数 col を指定する。
さらに各州を指定した色で塗りつぶすために引数 fill を TRUE に設定する。
最後に、この作業を、ループを用いてすべての州について行う。
地図はハワイ、アラスカ、ワシントンD.C.は含んでいないため、これらの州については省略する。
各州に色をつけるため引数 add を TRUE にする点に注意する。
2つの地図を作成するためのコードはほとんど同じで、各州を彩色するのにどの色を用いるかという点が唯一の違いである。
## 赤い州と青い州としてのアメリカ
map(database = "state") # 地図を作成
for (i in 1:nrow(pres08)) {
if ((pres08$state[i] != "HI") & (pres08$state[i] != "AK") &
(pres08$state[i] != "DC")) {
maps::map(database = "state", regions = pres08$state.name[i],
col = ifelse(pres08$Rep[i] > pres08$Dem[i], "red", "blue"),
fill = TRUE, add = TRUE)
}
}## 紫色の州としてのアメリカ
map(database = "state") # 地図を作成
for (i in 1:nrow(pres08)) {
if ((pres08$state[i] != "HI") & (pres08$state[i] != "AK") &
(pres08$state[i] != "DC")) {
map(database = "state", regions = pres08$state.name[i],
col = rgb(red = pres08$Rep[i], blue = pres08$Dem[i],
green = 0), fill = TRUE, add = TRUE)
}
}赤と青の地図から、オバマが西海岸と東海岸の多くの州で勝利している一方で、マケインは中西部でとりわけ強いことがわかる。
しかし、紫色の地図からは民主党か共和党で完全に占められている州はないことがわかる。
各州には両方の支持者がいて、勝者総取り方式の選挙制度のせいで各州が民主党支持の州か共和党支持の州として見えるだけである。
小売ディスカウント百貨店・倉庫型店舗として商業的成功を収めているアメリカ発祥の多国籍チェーンのウォルマートの拡大について検討する。
ウォルマートは、1962年アーカンソー州ロジャーズ (Rogers, Arkansas) に最初の店舗をオープンさせた。
その後の数十年間で、アメリカ国内外において数多くの店鋪をオープンさせ、世界最大の多国籍小売業者の1つになった。
ウォルマート店舗の新規開店に関するデータ walmart.csv には、最初の開店である1962年3月1日から2006年8月1日までのウォルマートの店舗の開店に関する空間と時間の情報が含まれている。
このデータセットに含まれる変数の名前と説明は以下の表の通りである。
| 変数 | 説明 |
|---|---|
opendate |
店舗の開店日 |
st.address |
店舗所在地の住所 |
city |
店舗所在地の市 |
state |
店舗所在地の州 |
type |
店舗のタイプ (Wal-MartStore, SuperCenter, DistributionCenter) |
long |
店舗所在地の経度 |
lat |
店舗所在地の緯度 |
まず、全店舗の位置を地図上にプロットする。
データセットは3つの異なるタイプの店舗の情報を含み、タイプの違いは変数 type によって表されている。
Wal-MartStore:通常のウォルマートの店舗
SuperCenter:通常のウォルマートにスーパーマーケットが併設された店舗(スーパーセンター)
DistributionCenter:食品や商品を通常のウォルマートやスーパーセンターへ配送する店舗(流通センター)
3タイプの店舗を区別するために異なる色を用いる。
通常のウォルマート:赤
スーパーセンター:緑
流通センター:青
各店舗を表す円が重なっても識別できるように透過色にする。
rgb() 関数で alpha = 1 / 3 と設定する。他の2タイプの店舗よりも数が少ない流通センターは目立つよう大きな円で示す。
walmart <- read.csv("walmart.csv")
walmart$storecolors <- NA # 空のベクトルを作成
## 赤 = 通常のウォルマート, 緑 = スーパーセンター, 青 = 流通センター
walmart$storecolors[walmart$type == "Wal-MartStore"] <-
rgb(red = 1, green = 0, blue = 0, alpha = 1/3)
walmart$storecolors[walmart$type == "SuperCenter"] <-
rgb(red = 0, green = 1, blue = 0, alpha = 1/3)
walmart$storecolors[walmart$type == "DistributionCenter"] <-
rgb(red = 0, green = 0, blue = 1, alpha = 1/3)
## 流通センターは大きめの円にする
walmart$storesize <- ifelse(walmart$type == "DistributionCenter", 1, 0.5)地図を作成しウォルマートの店舗の位置をそれに追加する。
また、legend() 関数を用いて凡例を追加する。
x 座標と y 座標を設定して凡例の場所を指定し、凡例で表示する文章のベクトルを引数 legend として示す。
引数 bty を設定しないデフォルトの状態では凡例は枠線で囲まれるが、bty = "n" と設定すれば枠線は消える。
プロットするオブジェクトのタイプを指定するには引数 pch を用いる。
ここでは色つきの円を用い、そのサイズは引数 pt.cex でコントロールする。
## 凡例付き地図
map(database = "state")
points(walmart$long, walmart$lat, col = walmart$storecolors,
pch = 19, cex = walmart$storesize)
par(family = "HiraginoSans-W3") #日本語が文字化けしないようにおまじない
legend(x = -120, y = 32, bty = "n",
legend = c("ウォルマート", "スーパーセンター", "流通センター"),
col = c("red", "green", "blue"), pch = 19, # 色付きの実線の円
pt.cex = c(0.5, 0.5, 1)) # 円の大きさこの地図はウォルマートの経営戦略をはっきりと示している。
スーパーセンターは中西部と南部全体に広く散らばっている。
一方、北東部や西海岸および都市部ではそれほど広がっておらず、通常のディスカウントストア型を超える拡大は行っていない。
今回の内容は下巻の第5章の内容に基づく。
原著 Quantitative Social Science (Princeton University Press) のウェブ・ページでデータなどをダウンロードできる。