choroplethr - Vignettes - i) 自分の地図を作る

Rのパッケージ`choroplethr`のビネットの翻訳です．
( 原文: http://cran.r-project.org/web/packages/choroplethr/index.html )

* a) [イントロダクション](http://qiita.com/nakamichi/items/23730349f31a377fb071)
* b) [アメリカの州単位コロプレス図](http://qiita.com/nakamichi/items/b8267674b610ef6e1cab)
* c) [アメリカの郡単位コロプレス図](http://qiita.com/nakamichi/items/2f63dcfb7b1cc407d87c)
* d) [アメリカの郵便番号に基づく地図](http://qiita.com/nakamichi/items/889d3883e9b2ff8e2cdf)
* e) [国家単位のコロプレス図](http://qiita.com/nakamichi/items/5090b4dadeed42c2e13c)
* f) [国勢調査の地図](http://qiita.com/nakamichi/items/de929da9335f96f6468c)
* g) [世界銀行データの地図](http://qiita.com/nakamichi/items/66fa782bb3104dd815bf)
* h) [コロプレス図の動画](http://qiita.com/nakamichi/items/02ca0f678933405cf18f)
* i) [自分の地図を作る](http://qiita.com/nakamichi/items/99ff93769f4f67b97d18)
* j) [行政区画レベル1の地図を作る](http://qiita.com/nakamichi/items/8fde40a12c6aca2abbd3)

----------

# i) 自分の地図を作る #

`choroplethr`はユーザが任意の地図のコロプレス図を作成するのをサポートするために，オブジェクト指向プログラミングを利用しています．もしこの機能に興味がある場合は，先に進むまえに以下の2つの解説を読むことをお勧めします．

* [Rプログラマのための地図作製法](https://github.com/trulia/choroplethr/wiki/Mapmaking-for-R-Programmers). このページではシェープファイルの取得や操作，またRにシェープファイルをインポートする方法に関する基本事項を扱っています．自分の地図を作ることに興味がある場合，まずはこの程度の情報については知っておくべきでしょう．

* [R6クラス入門](http://rpubs.com/wch/24456). `choroplethr`はオブジェクト指向プログラミングの実装に`R6`を使っています．自分で地図を作る場合は必ず`Choropleth`基底クラスを継承すべきです．このことが何を意味しているのか，基本的なことを理解しておく必要があります．



## Choropleth基底クラス ##

共通の機能を見出して基底クラスにまとめるのがオブジェクト指向プログラミングのカギです．そうすることでクライアント側は多くの共通した反復的な処理を「タダで」手に入れることができます．バージョン2.0の`choroplethr`パッケージにおける基底クラスは`Choropleth`と呼ばれ，5つの主要な関数を持っています．もし自分でコロプレス図作成プログラムを作ろうと思えば，（少なくとも）これら5つのステップが必要になるでしょう．


1. `initialize(map.df, user.df)`.  この関数はコンストラクタです．`map.df`はシェープファイルを`data.frame`で表現したものであり，"region"列が必要です．`user.df`はユーザのデータであり，"region"列と"value"列が必要です．この関数は入力に対して基本的なエラーチェックを行います．

2. `clip()`. この関数は，`user.df`から地図上に存在しない地域の要素を取り除きます．たとえば，50の州とプエルトリコとワシントンDCのデータを持っている場合があるかもしれませんが，その場合，地図に描画されない地域は取り除いて，`discretize()`を呼ぶ前にユーザに警告を出すべきでしょう．

3. `discretize()`. 州別の人口といった連続的な数値を，離散的な値にする必要があります．たとえば，各州の人口に基づいて七色のうち一色を各州に割り当てたい，という場合があるかもしれません．

4. `bind()`. 離散化された値を地図に結びつける必要があります．また，データセットが地図上の全ての値を含んでいない場合には，ユーザに警告を出したいと思うかもしれません．

5. `render()`. 最後のステップは結果を描画することです．最終結果の描画は簡単なこともあれば，複雑なこともあります．たとえば，アメリカの50州を正しいスケールで描画するのはかなり容易ですが，アラスカとハワイを埋め込むのは大変です．


## 例：世界地図 ##
`Choropleth`基底クラスの機能を使えば，国単位のコロプレス図を簡単に作成することができます．世界地図の詳細が知りたい場合は`data(country.map); ?country.map`とタイプしてください．

```{r}
library(choroplethr)
library(choroplethrMaps)
library(R6)
library(Hmisc)
library(stringr)
library(dplyr)
library(scales)d
library(ggplot2)

# Choropleth基底オブジェクトを継承してクラスを作成
CountryChoropleth = R6Class("CountryChoropleth",
  inherit = choroplethr:::Choropleth,
  public = list(

    # 世界地図の初期化
    initialize = function(user.df)
    {
      data(country.map, package="choroplethrMaps")
      super$initialize(country.map, user.df)
    }
  )
)

# サンプルデータの作成と描画

data(country.regions, package="choroplethrMaps")
df = data.frame(region=country.regions$region, value=sample(1:nrow(country.regions)))
c  = CountryChoropleth$new(df)
c$render()
```
![your-own-map.png](https://qiita-image-store.s3.amazonaws.com/0/58917/be3969da-8a49-60f3-6fcc-29a212773bf1.png)

この場合，基底クラスはデフォルトで望ましい振る舞いをしてくれます．必要なのは自分の地図でオブジェクトを初期化することだけです．

`$new()`で地図を作成して`$render()`を呼ぶだけで地図を描画することができます．地図のカスタマイズの例として，`country_choropleth`関数を見てみましょう．

```{r}
country_choropleth
```

```{r}
## function (df, title = "", legend = "", buckets = 7, zoom = NULL) 
## {
##     c = CountryChoropleth$new(df)
##     c$title = title
##     c$legend = legend
##     c$set_buckets(buckets)
##     c$set_zoom(zoom)
##     c$render()
## }
## <environment: namespace:choroplethr>
```

`Choropleth`基底クラスを使えば，多くの機能をタダで手に入れることができます．

* 入力のエラーチェック
* `zoom`パラメータを使って地域の一部分にズームインする機能．
* `buckets`パラメータを使ってデータをビジュアルに探索する機能
* `title`パラメータと`legend`パラメータで簡単にタイトルと凡例を作成する機能