EnsekiTT Blog

EnsekiTTが書くブログです。

Python+Matplotlibでグラフに対して追加で縦線や横線を書く話

つまりなにしたの?

PythonのMatplotlibでグラフを書くときに補助線に当たる値を指定したただの線を書いた。

f:id:ensekitt:20190121224914j:plain
Python+Matplotlibでグラフに対して追加で縦線や横線を書く話

なんでやろうと思ったの?

グラフを書いたときに、補助線を引きたくなることがある。強調したかったり、比べたかったりと様々な理由がある。
データ分析における用例としては、Precision RecallでF値が最大になる閾値のところに線を引いたりとか・・・
そんなときに、よくプロットに使うMatplotlibでサクッと線が引けるとありがたい。

で、いつものごとく毎回ググるのがしんどいのでアウトプットして覚えることにした。

とりあえず結果

f:id:ensekitt:20190121223732p:plain
result

ヒストグラムの平均値とか25%、75%に線を引いてみたり、
量の最大値、最小値や量の平均に線を引いてみた。

前提となるコード

import pandas as pd
import matplotlib.pyplot  as plt

# Kaggleのポケモンに関するデータセットを使ってみた
# https://www.kaggle.com/abcsds/pokemon

data = "Pokemon.csv"
dataf = pd.read_csv(data)

dataf.head()

f:id:ensekitt:20190121223843p:plain
head

こんな感じで読み込めた。

縦線を引く

ポケモンの攻撃力の値をもとに縦線を引いてみた。
平均、25%線、75%線の3本

plt.hist(dataf["Attack"])
# 縦線
plt.vlines([dataf.describe()["Attack"]["mean"]], 0, 180, "blue", linestyles='dashed')
plt.vlines([dataf.describe()["Attack"]["25%"]], 0, 180, "red", linestyles='dashed')
plt.vlines([dataf.describe()["Attack"]["75%"]], 0, 180, "red", linestyles='dashed')

f:id:ensekitt:20190121224133p:plain

横線を引く

ポケモンの攻撃力の値をもとに横線を引いてみた。
度数の最大、最小、平均の3本

v = plt.hist(dataf["Attack"])
# 横線
plt.hlines([v[0].mean()], v[1].min(), v[1].max(), "blue", linestyles='dashed')
plt.hlines([v[0].min()], v[1].min(), v[1].max(), "red", linestyles='dashed')
plt.hlines([v[0].max()], v[1].min(), v[1].max(), "red", linestyles='dashed')

f:id:ensekitt:20190121224205p:plain

最初に示した結果のコード

v = plt.hist(dataf["Attack"])
# 縦線
plt.vlines([dataf.describe()["Attack"]["mean"]], 0, 180, "blue", linestyles='dashed')
plt.vlines([dataf.describe()["Attack"]["25%"]], 0, 180, "red", linestyles='dashed')
plt.vlines([dataf.describe()["Attack"]["75%"]], 0, 180, "red", linestyles='dashed')
# 横線
plt.hlines([v[0].mean()], v[1].min(), v[1].max(), "blue", linestyles='dashed')
plt.hlines([v[0].min()], v[1].min(), v[1].max(), "red", linestyles='dashed')
plt.hlines([v[0].max()], v[1].min(), v[1].max(), "red", linestyles='dashed')

f:id:ensekitt:20190121224314p:plain

概要

縦線を引くには

plt.vlines([線を引きたい値], 線の小さい側の値, 線の大きい側の値, 色, 線のスタイル)

横線を引くには

plt.hlines([線を引きたい値], 線の小さい側の値, 線の大きい側の値, 色, 線のスタイル)

線を引きたい値が配列なのは、複数指定できる
例えば

v = plt.hist(dataf["Attack"])
# 横線
plt.hlines([v[0].mean()], v[1].min(), v[1].max(), "blue", linestyles='dashed')
plt.hlines([v[0].max(), v[0].min()], v[1].min(), v[1].max(), "red", linestyles='dashed') # 2つの値を指定した

としても先程と同じ実行結果が得られる
f:id:ensekitt:20190121224616p:plain

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。