Python 複数列を指定して、2軸の散布図を作成する「Matplotlib」

 '22/05/03更新:コードを簡潔に見直しました。
 本記事では、2軸プロットの散布図を作成する雛形コードを載せました。
例えば、下表のような複数列のcsvデータがあったとします。x軸に列名「time」, Y軸の第一軸に列名「linear」, Y軸の第二軸に列名「log」を指定します。

すると、下図のように2軸にグラフ化します。

そして、次のようにcsvファイルが複数ある場合にも対応しています。

下図のように、色の違いがcsvファイルの違いで識別できる仕様です。

■本プログラム

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

# In[1]:


import glob
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import matplotlib.cm as cm
plt.rcParams['font.size'] = 16 # グラフの基本フォントサイズの設定

file_list = glob.glob('./*csv')
file_list


# In[2]:


# プロットカラーを指定するための処理
cnt = len(file_list)

color_list = []
for i in range(cnt):
    color_list.append(cm.cool(i / cnt)) # autumn, cool
color_list


# In[5]:


# グラフにプロットする列名を指定
x_name = 'time' # X軸
y1_name = 'linear' # Y軸 
y2_name = 'log' # Y軸 第二軸
label = '凡例'
lenged_list = file_list # 凡例の名前のリスト
title = 'グラフ'

# グラフオブジェクトの生成
fig, ax1 = plt.subplots(figsize = (6, 4))
ax1.grid()

handle_list = [] # 凡例の色オブジェクトのリスト
for i, file in enumerate(file_list):
    # ファイル読み込み
    df = pd.read_csv(file)
    
    # グラフ化するデータを抽出
    x = df[x_name]
    y1 = df[y1_name]
    y2 = df[y2_name]
    
    # 第1軸
    ax1.scatter(x, y1, c = color_list[i])
    ax1.plot(x, y1, c = color_list[i])
    ax1.set_ylim(0, 70)
    ax1.set_xlabel(x_name)
    ax1.set_ylabel(y1_name)
    
    # 第2軸
    ax2 = ax1.twinx()
    p1 = ax2.scatter(x, y2, c = color_list[i])    
    p2, = ax2.plot(x, y2, c = color_list[i])
    handle_list.append(p2)
    ax2.set_ylim(-11, 2)
    ax2.set_ylabel(y2_name)
    
    # レイアウトの自動微調整
    fig.tight_layout()
    
# 凡例
plt.legend(
    handles = handle_list,
    labels = lenged_list,
    bbox_to_anchor = (1.85, 0.9),
    title = label,
    fontsize = 16,
)
plt.title(title)
#plt.show()
plt.savefig(title + '.jpg')

以上

<広告>