LoginSignup
3

More than 5 years have passed since last update.

ビフォーアフターを比べ易いのslope graphをRで描こう

Posted at

この記事について

Slope Graph は、Edward Tufte が30年前に提案した可視化の手法です。棒グラフとかと比べたらあまり人気はないけど、最近人気な本、Storytelling With Data に改めて推奨されていた。その例としては:

alt text
Source: http://www.storytellingwithdata.com/

データ可視化ていうと、私あまり難しいことしないので、ぶちゃけほどんと MS Excel でできると思う。Excel はすごい。Storytelling with Data の中のグラフも全部 Excel で作られたていう。
ただの可視化のために、R や Python の code を書くメリットていうと、”再利用”ができるぐらいかな?でも Excel 一回作ったら、データをコピーペーしても再利用できるしね。
けど、 Slope Graph は比較的に新しい(不人気)コンセプトなので、すぐに使えるテンプレートはない!
Excelでもかなり苦労してる。(こちらの記事を参考してください)

このとき、R は頼もしい。
この記事にお世話になったので、Qiitaでまとめたいと思います。

データ

ランキングを比べたいから、このサイトからプログラミング言語の人気度データを参考しました。

結果

この感じのグラフを R で作りたいと思いますー!

tiobeIndex2.png

R Code

library(ggplot2)
library(scales)

slope_graph <- function(group, data_left, data_right, reverse = FALSE){

  ## colorblind-friendly palette
  cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

  df<-data.frame(group, data_left,data_right)

  ## データラベルを作っとく
  left_label <- paste(df$group, df$data_left, sep=",")
  right_label <- paste(df$group, df$data_right,sep=", ")  

  ## 色分け用
  df$class <- ifelse((df$data_left - df$data_right) > 0, "blue", df$class)

  ## プロット
  p <- ggplot(df) + geom_segment(aes(x=1, xend=2, y=data_left, yend=data_right, col=class), size=.75, show.legend=F) + 
    geom_vline(xintercept=1, linetype="dashed", size=.1) + 
    geom_vline(xintercept=2, linetype="dashed", size=.1) +
    scale_color_manual(values = c("blue"=cbPalette[3], "gray"=cbPalette[1], "orange" = cbPalette[2])) +  # color of lines
    xlim(.5, 2.5)   # X axis limits

  ## 順番回転かどうか
  if(reverse){
    p <- p + scale_y_reverse()
    left_y = 0 - df$data_left
    right_y = 0 - df$data_right
  }else{
    left_y = df$data_left
    right_y = df$data_right
  }

  # データラベルを追加
  p <- p + geom_text(label=left_label, y=left_y, x=rep(1, NROW(df)), color=df$class, hjust=1.1, size=2.5)
  p <- p + geom_text(label=right_label, y=right_y, x=rep(2, NROW(df)), color=df$class, hjust=-0.1, size=2.5) 

  p
}

そしてデータを読み込んで、slope_graphに投げる。

## データを読み込む
data <- read.csv('programmingLanguageRank.csv')
data

## 使う欄をアサイン
group <- data$Programming.Language
data_left <- data$Jul.2016
data_right <- data$Jul.2017

## slope_graphを呼ぶ
mygraph <- slope_graph(
  group, 
  data_left,
  data_right)

mygraph

ここまではこの感じにできる。
tiobeIndex3.png

要注意のは、ランキングを比べたいから、数字ちいさいほうから並べて欲しいので、回転のパラメータをいれました。

mygraph <- slope_graph(
  group, 
  data_left,
  data_right, 
  reverse = TRUE)

そして、ggplotのオブジェクトだから、気軽く+でデコできる。

## タイトルとかを追加する
mygraph <- mygraph + geom_text(label="2016", x=1, y=0, hjust=1.2, size=3)  # 左のタイトル
mygraph <- mygraph + geom_text(label="2017", x=2, y=0, hjust=-0.1, size=3)  # 右のタイトル
mygraph <- mygraph + labs(title = "TIOBE Index", caption= "Data source : https://www.tiobe.com/tiobe-index/") + theme(plot.title = element_text(hjust = 0.5))
mygraph <- mygraph + labs(x="",y="Ranking of Programming Languages") # Axis labels

mygraph 

## いらないものを消す
mygraph + theme(panel.background = element_blank(), 
          panel.grid = element_blank(),
          axis.ticks = element_blank(),
          axis.text = element_blank(),
          panel.border = element_blank(),
          plot.margin = unit(c(1,2,1,2), "cm"))

これで出来上がり。
気になる言語を比べたいときは、サブセットをとりましょう。

languages.I.care = c('Python','R', 'MATLAB', 'Perl')
data <- data[data$Programming.Language %in% languages.I.care,]

# このdataを使って、さっきのデータ読み込みの後のコードをもう一回実行する

tiobeIndex4.png

結論

けっきょく R でもすぐ呼べる関数がないから、ちょっと面倒くさそうだけど、一回書いたら繰り返して使えるので、Excel より少し楽、かな。^_−☆

Reference

http://www.storytellingwithdata.com/blog/2014/03/more-on-slopegraphs
http://stephanieevergreen.com/slopegraph/
https://acaird.github.io/computers/r/2013/11/27/slopegraphs-ggplot
Slope Graphの歴史:
http://charliepark.org/slopegraphs/

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3