Excelはデータの可搬性が低かったりグラフの調整がしにくかったりと問題が多いので、相変わらずグラフの作成は基本的にgnuplotを使ってる。
で、ある資料でプログラミング言語の人気ランキングがどう変化するのか、みたいのを作る必要が出てきた。具体的にはgithubのブログに貼ってある感じのやつ。ポイントは
- 縦軸は上から下に向かって1〜10位にしたい
- 凡例はそれぞれの線の右端に書きたい
まずCSVデータは以下のようになる。
year,JavaScript,Python,Java,TypeScript,C#,C++,PHP,Shell,C,Ruby
2014,1,4,2,10,8,6,3,9,7,5
2015,1,3,2,10,7,6,4,9,8,5
2016,1,3,2,10,6,5,4,9,8,7
2017,1,3,2,10,6,5,4,8,7,9
2018,1,3,2,7,6,5,4,9,8,10
2019,1,2,3,5,7,6,4,9,8,10
2020,1,2,3,4,5,7,6,9,8,10
2021,1,2,3,4,5,7,6,8,9,10
2022,1,2,3,4,5,6,7,8,9,10
これをプロットするために、以下のように設定する。
# 線の右側に各プロットの名称を置きたいので、2年分余白を置く
set xrange [2014:2024]
# yrangeを[10:1]とすると10位と1位が外枠に張り付くので、ここも余白
set yrange [11:0]
# 横軸目盛は2022年までしか書かない
set xtics 2014, 1, 2022
# ticsの増分をマイナスにすると目盛の向きが反転する。今回一番の発見。
# ただし上限を1にすると1が表示されず、0にすると0が表示される。バグ?
set ytics 10, -1, 0.5
# 標準の凡例は用いない
set nokey
# ラベルを最新データの右側に置く
set label 1 at first 2022.5,1 "JavaScript"
set label 2 at first 2022.5,2 "Python"
set label 3 at first 2022.5,3 "Java"
set label 9 at first 2022.5,9 "C"
︙
set label 10 at first 2022.5,10 "Ruby"
# カンマ区切りデータなのでセパレータを設定
set datafile separator ","
あとはこんな感じでプロットする。plotコマンド1つでusingを繰り返し書いてもいいのだが、1行ずつ別コマンドにしておきたかったのでreplotを使っている。
plot "githubrank.csv" using 1:2 w lp lw 3 pt 7 lc "dark-yellow"
replot "githubrank.csv" using 1:3 w lp lw 3 pt 7 lc "skyblue"
replot "githubrank.csv" using 1:4 w lp lw 3 pt 7 lc "dark-gray"
︙
replot "githubrank.csv" using 1:11 w lp lw 3 pt 7 lc "black"
set term png
set output "rankingtest.png"
replot
これで結構いい感じのグラフが描けた。