はじめに
最近の git は web サイト上で .ipynb ファイルがレンダリングされます。
そのため、社内の某チームでは分析履歴として gitlab 上で管理しているのですが、
lightgbm の plot_importance で出力したグラフがレンダリングされませんでした。
そこで、自力でどうにかしようと頑張った際の記録となります。
ゴール
こういうグラフを作りたい(項目名は隠しています)
予測に使った変数とその重要度を、棒グラフで上から重要な順に表示したものです。
やったこと
準備
import matplotlib.pylab as plt
%matplotlib inline
x = ['a', 'b', 'c', 'd']
y = [1,3,4,2]
ステップ1
とりあえず何も考えず棒グラフ(横)にしてみます。
plt.barh(x,y)
もちろん並び順そのままのグラフが出来ます。
ステップ2
次に、値でソートしたグラフにしてみます。
dict_y = {i: val for i, val in enumerate(y)}
sorted_tmp = sorted(dict_y.items(), key=lambda x: -x[1])
idx = []
vals = []
cols = []
for i, j in enumerate(sorted_tmp):
idx.append(i)
vals.append(j[1])
cols.append(x[j[0]])
plt.barh(idx, vals, tick_label=cols)
降順ソート(下に行くほど重要)のグラフが出来ました。
ちなみに上記のように、一旦 index 順に項目を並べてから、tick_label で項目名を
index → cols に塗り替えてやらないと、ソートされたグラフにはなりませんでした。
plt.barh(cols, vals)
のようにすると、ステップ1 と同じグラフが出来ました。
ステップ3
人それぞれだと思いますが、なんか昇順になっているのが気に食わない…
できるなら値が大きいものを上に表示させたい、という気持ちがありました。
(特に今回は何の変数が重要かを示したいので、上に持ってきたかった)
調べたところ、反転させるには ylim
が使えそうだったので使ってみました。
ylim
は y 軸の表示範囲指定に使うもので、例えば ylim(0, 10)
とすれば
y = 0~10 の範囲にグラフ表示が限定されます。
しかし、これを ylim(10, 0)
のように大きい方の値を第 1 引数にもってくれば
値が反転するらしいのでやってみました。
plt.ylim(max(vals), -1)
plt.barh(idx, vals, tick_label=cols)
想定通り。lightgbm の plot_importance と同じようなグラフが出来ました。
まとめ
今回やったことをまとめると以下のようになります。
import matplotlib.pylab as plt
%matplotlib inline
x = ['a', 'b', 'c', 'd']
y = [1,3,4,2]
dict_y = {i: val for i, val in enumerate(y)}
sorted_tmp = sorted(dict_y.items(), key=lambda x: -x[1])
idx = []
vals = []
cols = []
for i, j in enumerate(sorted_tmp):
idx.append(i)
vals.append(j[1])
cols.append(x[j[0]])
plt.ylim(max(vals), -1)
plt.barh(idx, vals, tick_label=cols)
感想
グラフのソートと軸反転はいつか役立つかもしれないので覚えておきたいと思います。
でも、 pandas とかでもっと簡単にできそうな気もする。。。
あと、そもそもの話になりますが
lightgbm の plot_importance で出力したグラフがレンダリングされませんでした。
こう言ったけど、本当にレンダリングしてくれないのかなぁ…
追記
lightgbm.plot_importance
に関しては、 plt.show()
を明示的に入れるだけで
グラフ表示されました。ハハハ
また、1つのセルでグラフ表示と print をしようとすると、片方(先に実装される方)だけが
git 上では表示されるようです…
例えば以下の場合。 グラフは出力されますが print は出力されませんでした。