tmapパッケージはしばらく更新がないらしい

先日tmap(version 1.11)の更新通知が来ていた。 たまたまNewsを確認したところ下記のような記載があり、 sfパッケージがspに置き換わるまでしばらく更新はなさそうである。

NOTE: this will be the last version before the major update (in which sf fully replaces sp)

github.com

issuesには現時点で25項目上がっているが、これらは今後解決していくのだろうか。

tmapパッケージはしばらく更新がないらしい

先日tmap(version 1.11)の更新通知が来ていた。 たまたまNewsを確認したところ下記のような記載があり、 sfパッケージがspに置き換わるまでしばらく更新はなさそうである。

NOTE: this will be the last version before the major update (in which sf fully replaces sp)

github.com

issuesには現時点で25項目上がっているが、これらは今後解決していくのだろうか。

国立大学の職位別の人数と年齢構成

文科省では学校教員統計調査というのをやっているらしい。 最新だと平成28年の実施結果がe-statにて公開されているので、可視化してみた。

詳しいことはわからないが、 男性は職位と人数が反比例しているが、 近年の女性活躍させるという政策の下?、女性は助教の数が教授の人数を上回っている。

また、男性教授の年齢構成をみると、ある年齢の人から教授の数が減る(増える) ポイントがあることがわかる。 教授になる人が多い年齢ということなのか、昇進の抑制とかの影響なのかはよくわからない。

  • 職位別の年齢構成(縦棒は各職位の最頻値を表している) f:id:jerrarrdan:20171113002419p:plain

  • 職位別の人数の累積 f:id:jerrarrdan:20171113002429p:plain

高速にggplotする

ここ(Accelerating ggplot2: use a canvas to speed up plots creation)にあるように、 ベースマップを作成しておくことで高速な描画が期待できる。

library(tidyverse)
library(sf)

nc <- read_sf(system.file("shape/nc.shp", package="sf"))
nc_p <- st_sample(nc, size = 100) %>% st_sf()
base_map <- ggplot(data=nc) + geom_sf()

microbenchmark::microbenchmark(
  base_map + geom_sf(data = nc_p),
  ggplot(data=nc) + geom_sf() + geom_sf(data=nc_p)
)
Unit: milliseconds
                                                 expr      min       lq     mean   median       uq      max neval cld
                      base_map + geom_sf(data = nc_p) 2.378383 2.499209 2.937826 2.576802 2.827515 24.75987   100  a 
 ggplot(data = nc) + geom_sf() + geom_sf(data = nc_p) 4.982936 5.213071 5.761455 5.411302 6.064894 10.97817   100   b

行番号(名前)をデータフレームに追加する

これまではtibble::rowid_to_column()を利用してきたが、この処理をもう少し早くする必要が出てきてしらべていたら、dplyr::add_rownames()の存在を知り、速度比較したらあやかったので今後はこれを使うことにする。

library(tidyverse)
library(microbenchmark)
library(data.table)


iris_df <- iris %>% as.data.table()

microbenchmark(iris %>% add_rownames(),
               iris %>% rownames_to_column(),
               iris_df %>% add_rownames(),
               iris %>% mutate(id = seq.int(nrow(.))))
Unit: milliseconds
                                   expr      min       lq     mean   median       uq      max neval cld
                iris %>% add_rownames() 1.218453 1.262064 1.416237 1.310582 1.368730 4.750718   100 a  
          iris %>% rownames_to_column() 2.834875 2.919264 3.122361 2.996101 3.133352 5.571955   100   c
             iris_df %>% add_rownames() 1.384211 1.447833 1.556418 1.512777 1.599620 2.527902   100 a  
 iris %>% mutate(id = seq.int(nrow(.))) 2.348928 2.415761 2.593333 2.479005 2.568303 5.112818   100  b 

追記: dplyr::add_rownames()はduplicatedとなっており、代わりにtibble::rownames_to_column()を利用せよというwarningが出てくる。 少し遅いがtibbleの関数を利用するほうが無難という結論。

グラフをつくる前に読む本

グラフをつくる前に読む本を読んだ。 献本されたというツイッターを多く見たので、読んでみた。

下記に示すグラフの種類についてどのような場合に・どのようなことを表現したいときに利用すべきかが書いてある。

  • 棒グラフ
  • 折れ線グラフ
  • 円グラフ
  • レーダーチャート
  • ヒートマップ
  • 散布図
  • 積み上げグラフ

これまでにさまざまなグラフを見てきていると思うので、 自身の理解している(把握している)使い方と相違なければすらすらと読める。 ある意味当たり前のことが書かれている。ただし、自身のこれまで用いてきた使い方の再確認するという意味では一度読んでおいてよいと思う。

また、それぞれのグラフが用いられた起源について書かれており、どのような経緯でそれぞれのグラフで表現する必要性があり生まれたかが少しわかり面白いと思う。 また著者の方針ですべてのグラフにはオープンにされている実データを用いており、より分かりやすくなっていると思う。

ところどころに著者のデータに対する解釈が書かれており(その解釈が正しいかどうかは別として)、データの結果を単に示すことだけでなくそこからいかに考察しデータを読み解くことが重要であると考えさせられた。

利益が絡むと、よく見えるようにインチキ工夫しようと考えるが、 ぜひ本を読んでまじめなグラフづくりが行われるように願うばかりである。

RQGISを利用してみる

RQGISパッケージを利用することでQGISの関数を利用することができる。

インストール方法はvignetteにまとめられているので、そちらを参考に進めるとインストールできる。

ger <- raster::getData(name = "GADM", country = "DEU", level = 1)
library(sp)
library(tidyverse)
library(sf)
library(RQGIS)
set_env()
Trying to find QGIS in C:/OSGEO4~1.
$root
[1] "C:\\OSGeo4W64"

$qgis_prefix_path
[1] "C:\\OSGeo4W64\\apps\\qgis-ltr"

$python_plugins
[1] "C:\\OSGeo4W64\\apps\\qgis-ltr\\python\\plugins"

必要とするアルゴリズムを検索する場合にはfind_algoristhms()を利用する。 検索の際には正規表現を利用することができる。

find_algorithms(search_term = "(polygon)(centroid)")
[1] "Polygon centroids------------------------------------>qgis:polygoncentroids"
[2] "Polygon centroids------------------------------------>saga:polygoncentroids"
find_algorithms(search_term = "(split)(line)")
[1] "Split lines with lines------------------------------->qgis:splitlineswithlines"

使い方を確認したい場合にはget_usage()を利用する。

get_usage(alg = "qgis:polygoncentroids")
ALGORITHM: Polygon centroids
    INPUT_LAYER <ParameterVector>
    OUTPUT_LAYER <OutputVector>

必要なパラメータを確認するにはget_args_man()を利用する。

params <- get_args_man(alg = "qgis:polygoncentroids")
params
$INPUT_LAYER
[1] "None"

$OUTPUT_LAYER
[1] "None"

実際にqgisアルゴリズムを実行する。

params$INPUT_LAYER <- ger
params$OUTPUT_LAYER <- file.path(tempdir(), "get_coords.shp")
out <- run_qgis(alg = "qgis:polygoncentroids",
                INPUT_LAYER = ger,
                OUTPUT_LAYER = file.path(tempdir(), "ger_coords.shp"),
                load_output = T)

出力結果を確認する。qgis:polygoncentroid の場合はsfオブジェクトで結果が得られる。

class(out)
[1] "sf"         "tbl_df"     "tbl"        "data.frame"
plot(ger)
plot(out, add = T, col = "blue")

f:id:jerrarrdan:20171016212513p:plain

日本語を含むデータがある場合にはうまく実行できないので注意する必要がある。 実行できたとしてもデータフレームないの文字が文字化けしているので、データを確認すること。文字化けを回避する方法ご存知の方がいましたらコメントお願いいたします。