Python 複数のcsvからX,Y軸にしたい列名を指定して、ひとつの散布図を作成する

'21/06/15更新:グラフ化のオプション設定をいくつか追記しました。
 複数のcsvファイルから下図のような散布図一枚を作成する雛形コードを載せました。
f:id:HK29:20210615223559p:plain

 下図は、csvファイルの例です。一行目がヘッダーでなくても、データ開始行が2行目でなくても、pandasだと簡単に読み込むことができます。そして、グラフ化についても、pandasデータフレームとX軸とY軸にする列名を指定して引数に渡す仕様のため容易です。

f:id:HK29:20210615224019p:plain

 関数名は、plot_df_func(df_list, label_list, x_data_name, y_data_name)で、引数は4つあります。順に、①複数csvファイルを読み込んでデータ前処理したpnadasデータフレームのリスト、②グラフ表示する凡例(ラベル)のリスト、③x軸にするデータの列名、④y軸にするデータの列名です。

■本プログラム
JupyterLabで作成したコードを.pyファイルに出力したコードです。AnacondaPromptなどのCUI上でも実行できます。JupyterLabなどの場合は、上から順にインタラクティブに実行します。

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

# In[1]:


import glob
import re

# 複数ファイルをリストに格納
file_list = glob.glob('./*csv')
file_list = sorted(file_list, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
print(file_list)


# In[2]:


import pandas as pd

# データファイルを読み込み、pandasのデータフレームでリスト化する
df_list = []
for file in file_list:
    df = pd.read_csv(file, # 読み込むファイル名
                 skiprows = [2], # スキップする行をリストで指定
                 header = 1, # ヘッダーにする行
                 encoding = 'cp932', # 'UTF-8' 'shift_jis' 'cp932'
    )
    # データの前処理
    df2 = df.copy()
    #df2['stress'] = df['stress'] / 1000
    df_list.append(df2)
df_list


# In[3]:


# グラフ化する関数
myXscale = 'linear' # 'linear' or 'log'
myYscale = 'linear'
my_x_range = (0, 15) # オートレンジにする場合は空()を指定
my_y_range = () # オートレンジにする場合は空()を指定
base_line = 75
n_files = len(file_list)

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import japanize_matplotlib
plt.rcParams["font.size"] = 14
from matplotlib.axes._axes import _log as matplotlib_axes_logger
matplotlib_axes_logger.setLevel('ERROR')

def plot_df_func(DF_list, LABEL_list, X_name, Y_name):
    plt.figure(num=1, figsize=(8, 6), dpi=100, facecolor='w', edgecolor='k')
    for i, (my_DF, my_LABEL) in enumerate(zip(DF_list, LABEL_list)):
        x_list = my_DF[X_name].values.tolist()
        y_list = my_DF[Y_name].values.tolist()
        plt.scatter(x_list, y_list, c=cm.hsv(i/n_files), s=30) #, color="red")
        plt.plot(x_list, y_list, c=cm.hsv(i/n_files), label=my_LABEL)

    ### matplotlib option
    # 縦軸,横軸の線形 or 対数の指定
    plt.xscale('log') if myXscale=='log' else plt.xscale(myXscale)
    plt.yscale('log') if myYscale=='log' else plt.yscale(myYscale)

    # 縦軸のレンジの指定
    ax = plt.gca()
    y_min, y_max = ax.get_ylim()
    if my_y_range:
        y_min, y_max = my_y_range
        plt.ylim(y_min, y_max)
    else:
        ax.set_ylim(0, y_max)

    # 基準線
    if my_x_range:
        plt.hlines([base_line], my_x_range[0], my_x_range[1], 'r', linestyles='dashed')
        ax.text(my_x_range[0], base_line, '判断基準' + str(base_line), size=22, color='r')

    plt.legend(loc='best', fontsize=18)  # 'upper left' and so on
    #plt.legend(bbox_to_anchor=(1, 0.95)) # 凡例の位置
    plt.title("graph", fontsize=18)
    plt.xlabel(X_name, fontsize=20)
    plt.ylabel(Y_name, fontsize=20)
    plt.tick_params(labelsize=18)
    plt.grid(which="both")
    plt.tight_layout()
    plt.show()
    #plt.savefig(file_name + '.jpg')
    #plt.close()

# グラフの作成
#label_list = ['data1', 'data2', 'data3', 'data4']
label_list = file_list.copy()
x_data_name = 'x'
y_data_name = 'stress'
plot_df_func(df_list, label_list, x_data_name, y_data_name)


# In[ ]:

以上

<広告>