Text Update: 12/13, 2018 (JST)
Bullet graph(ブレットグラフ)とは、 Stephen Few により考案されたダッシュボードのゲージとメータを置き換えるためのグレースケールグラフで、実測値(実績値)が目標値とどの程度乖離しているかを一目で把握できます。
R では d3Dashboard
パッケージ に関数が用意されていますが利用できるデータがリスト形式であったり日本語環境にインストールできなかったりと何かと厄介ですので、ここではggplot2
パッケージなどを用いて描く方法を紹介します。
Packages and Datasets
本ページではR version 3.4.4 (2018-03-15)の標準パッケージ以外に以下の追加パッケージを用いています。
Package | Version | Description |
---|---|---|
ggplot2 | 3.1.0 | Create Elegant Data Visualisations Using the Grammar of Graphics |
knitr | 1.21 | A General-Purpose Package for Dynamic Report Generation in R |
plotly | 4.8.0 | Create Interactive Web Graphics via ‘plotly.js’ |
tidyverse | 1.2.1 | Easily Install and Load the ‘Tidyverse’ |
Bullet graph とは?
ブレットグラフは下図のような一種の棒グラフです。横にも縦にも描きます。
グラフ要素としては、大きく分けて以下の3要素となります。
- 中央の黒実線は実測値(実績値)
- 実績値とクロスする右側の縦黒線は目標値
- グレーの背景ケールは評価値(評価レンジ)
- 左から順に「悪い、普通、良い」などの意味で使う
この内、3番目の背景スケールは使われないこともあります。また、色合いは基本仕様ではグレースケールです。
データ形式を考える
前述のようなグラフを描くための必要なデータをデータフレーム型として用意したいので、以下のような構造が考えられます。
title | measures | markers | lower | middle | upper | |
---|---|---|---|---|---|---|
意味 | タイトル | 実測値 | 目標値 | 下限値 | 中間値 | 上限値 |
データ | Mandatory | Mandatory | Mandatory | Optional | Optional | Optional |
ggplot2で描く
テストデータ
前述の構造を持ったデータフレーム型変数を用意します。
(df <- data.frame(
title = c("Item 1", "Item 2", "Item 3", "Item 4", "Item 5"),
measures = c(19, 21, 28, 21, 28),
markers = c(22, 23, 26, 22, 30),
lower = c(13, 9, 12, 12, 13),
middle = c(21, 22, 24, 21, 27),
upper = c(28, 30, 32, 31, 36))) %>% knitr::kable()
title | measures | markers | lower | middle | upper |
---|---|---|---|---|---|
Item 1 | 19 | 22 | 13 | 21 | 28 |
Item 2 | 21 | 23 | 9 | 22 | 30 |
Item 3 | 28 | 26 | 12 | 24 | 32 |
Item 4 | 21 | 22 | 12 | 21 | 31 |
Item 5 | 28 | 30 | 13 | 27 | 36 |
描く
テストデータでは各データのレンジ似たような範囲ですので、上限値、中間地、下限値、実測値(実績値)、目標値の順でグラフを描くだけで済みます。標準仕様ではグレースケールですが、今回はカラフルな配色で描いてみます。
(df %>%
ggplot2::ggplot(ggplot2::aes(x = title)) +
ggplot2::geom_bar(ggplot2::aes(y = upper), fill = "plum1",
stat = "identity", width = 0.5, color = "white") +
ggplot2::geom_bar(ggplot2::aes(y = middle), fill = "plum3",
stat = "identity", width = 0.5, color = "white") +
ggplot2::geom_bar(ggplot2::aes(y = lower), fill = "plum4",
stat = "identity", width = 0.5, color = "white") +
ggplot2::geom_bar(ggplot2::aes(y = measures), stat = "identity",
width = 0.1, fill = "white") +
ggplot2::geom_errorbar(ggplot2::aes(y = markers,
ymin = markers, ymax = markers,
width = 1.5)) +
ggplot2::coord_flip() +
ggplot2::labs(x = "", y = "", title = "Bullet graph")) %>%
plotly::ggplotly()
(df %>%
ggplot2::ggplot(ggplot2::aes(x = title)) +
ggplot2::geom_bar(ggplot2::aes(y = measures), stat = "identity",
width = 0.1, fill = "plum") +
ggplot2::geom_errorbar(ggplot2::aes(y = markers,
ymin = markers, ymax = markers),
width = 1.5) +
ggplot2::coord_flip() +
ggplot2::labs(x = "", y = "", title = "Bullet graph")) %>%
plotly::ggplotly()