Python グラフに横線(縦線)とテキストを挿入する方法「matplotlib」

'22/05/03更新:コードに冗長な箇所があったのを若干短くした。
 本記事では、散布図や折れ線図等で判断基準線が視覚的にわかるグラフを作成する雛形コードを載せました。下図のように、グラフ中に1. 赤色の横点線を入れ、2. 「判断基準1000以上」等とテキストを挿入します。

対象コードは次のように、挿入したい位置の座標を入力します。

# 横線を入れる
plt.hlines(挿入するy座標, 挿入するx座標の最小値, 挿入するx座標の最大値, 'r', linestyles='dashed')
# 縦線を入れる
plt.vlines(挿入するx座標, 挿入するy座標の最小値, 挿入するy座標の最大値,  'b', linestyles='dashed')
# テキストを挿入する
ax1.text(挿入するx座標, 挿入するy座標, 挿入するコメント, size=16, color='r')

 本プログラムの仕様について説明します。
対象データは、下表のように列方向にデータが並んだcsvファイルです。例では、yデータはy1, y2, y3の3列ですが、個数はいくつでも構いません。リストで列名(カラム名)を複数指定出来る仕様です。

x y1 y2 y3
0.0 0.0 0.0 0
5.0 250.0 25.0 37.5
10.0 500.0 100.0 0
15.0 750.0 225.0 -75
20.0 1000.0 400.0 -150
25.0 1250.0 625.0 -187.5
30.0 1500.0 900.0 -150
35.0 1750.0 1225.0 0
40.0 2000.0 1600.0 300
45.0 2250.0 2025.0 787.5
50.0 2500.0 2500.0 1500
55.0 2750.0 3025.0 2475
60.0 3000.0 3600.0 3750

そして、日本語フォントを使用する場合は、下記コマンドでjapanize-matplotlibのインストールが必要です。

pip install japanize-matplotlib

そして、import japanize_matplotlib でインポートして使用します。

seabornの場合は右記リンク先を参照下さい。Python 「matplotlib」や「seaborn」のグラフ内で日本語表示する - PythonとVBAで世の中を便利にする

▼本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import os, sys
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

file_path = 'data2.csv'

file_name = os.path.basename(file_path)
print(file_name)

root, ext = os.path.splitext(file_name)
print(root, ext)


# In[2]:


df = pd.read_csv(file_path,
                 header = 0,
                 #skiprows = [1, 2],
                 encoding = 'utf-8',
)
df


# In[3]:


### パラメータ
# 横軸Xの設定
my_x_name = 'x'
my_x_scale = 'linear'
my_x_range = (0, 70) # (下限, 上限) オートレンジにする場合は空()

# 縦軸Yの設定
my_y_name_list = ['y1', 'y2', 'y3']
my_y_scale = 'linear'
my_y_range = () #(0, 550)
my_y_label = 'y'

# 基準線とテキスト
base_line = 1000
base_line_comment = '判断基準\n' + str(base_line) + '以上'

# csvファイルの読み込み設定
my_header = 1 # csvファイルのヘッダー
my_start_row_of_data = 2 # 数値データの開始行


##### グラフ化
fig, ax1 = plt.subplots(figsize=(8,6))

# x軸のスケールを設定
ax1.set_xscale(my_x_scale)
# x軸の範囲を設定する
if my_x_range:
    ax1.set_xlim(my_x_range[0], my_x_range[1])
plt.title(root, fontsize=18) # タイトル
plt.xlabel(my_x_name, fontsize=20) # x軸ラベル
plt.grid(True)

for my_y_name in my_y_name_list:
    # 折れ線図
    ax1.plot(df[my_x_name], df[my_y_name], label=my_y_name)
    # 散布図
    ax1.scatter(df[my_x_name], df[my_y_name], facecolors='none', edgecolors='k')

    # y軸のレンジを設定
    if my_y_scale=='log':
        ax1.set_yscale('log', basey=10) # 10底の対数
    if my_y_range:
        ax1.set_ylim(my_y_range[0], my_y_range[1]) # レンジを指定

    # 目盛り表記をゲット
    x_ticklabels = ax1.get_xticklabels()
    y_ticklabels = ax1.get_yticklabels()

    # x軸ラベル表記を傾ける
    plt.setp(x_ticklabels, rotation=45, fontsize=16)

    # y軸ラベルを設定
    ax1.set_ylabel(my_y_label, fontsize=20) 
    plt.setp(y_ticklabels, rotation=0, fontsize=16)

    # 横線を入れる
    plt.hlines([base_line], my_x_range[0], my_x_range[1], 'r', linestyles='dashed')

    # テキストを挿入
    ax1.text(my_x_range[0], base_line, base_line_comment, size=18, color='r')

    # 凡例
    ax1.legend(bbox_to_anchor = (1.2, 1.0), fontsize = 16)

#plt.tight_layout() # ラベルが収まるように表示させる
plt.show()

#plt.savefig(file_name + '.png', bbox_inches='tight') #, transparent = True)
#plt.close()

以上

<広告>