Bullet graph
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 とは?

ブレットグラフは下図のような一種の棒グラフです。横にも縦にも描きます。
 

Wikipediaより

Wikipediaより

 
グラフ要素としては、大きく分けて以下の3要素となります。
 

  1. 中央の黒実線は実測値(実績値)
  2. 実績値とクロスする右側の縦黒線は目標値
  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()

 

参考資料

 
Enjoy!  

本blogに対するアドバイス、ご指摘等は データ分析勉強会 または GitHub まで。

CC BY-NC-SA 4.0 , Sampo Suzuki