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

##この記事について

**Slope Graph** は、Edward Tufte が３０年前に提案した可視化の手法です。棒グラフとかと比べたらあまり人気はないけど、最近人気な本、[Storytelling With Data](http://www.storytellingwithdata.com/blog/2014/03/more-on-slopegraphs) に改めて推奨されていた。その例としては：

![alt text](https://static1.squarespace.com/static/55b6a6dce4b089e11621d3ed/55b6d08fe4b0d8b921b02f83/55b6d094e4b0d8b921b0315f/1438044308816/1000w/ "Source: Storytelling with Data")
*Source: http://www.storytellingwithdata.com/*

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

このとき、R は頼もしい。
[この記事](https://acaird.github.io/computers/r/2013/11/27/slopegraphs-ggplot)にお世話になったので、Qiitaでまとめたいと思います。

## データ

ランキングを比べたいから、[このサイト](https://www.tiobe.com/tiobe-index/)からプログラミング言語の人気度データを参考しました。

## 結果

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

![tiobeIndex2.png](https://qiita-image-store.s3.amazonaws.com/0/104343/eeeda463-0652-7116-3761-521a35187bc0.png)



## R Code
 
```R
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に投げる。

```R
## データを読み込む
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](https://qiita-image-store.s3.amazonaws.com/0/104343/c8d5a5ff-43af-86b3-a501-934f4bff9d99.png)

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

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

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

```R
## タイトルとかを追加する
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"))
```

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

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

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

```
![tiobeIndex4.png](https://qiita-image-store.s3.amazonaws.com/0/104343/7e445fd4-5936-ee7a-5a2f-6cede06d6425.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/