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

'22/05/03更新:コマンドライン向け、JupyterLab向けの雛形コードを載せました。
 本記事では、下図のような散布図を作成するコードを載せました。フォントサイズ、散布図、折れ線図、ラベル、タイトル、凡例の指定ができて、jpgファイルに保存する仕様です。

f:id:HK29:20201217214145j:plain

 下図は、上図の元データです。「X軸にしたい列名」と、「Y軸にしたい列名をリスト」で指定することで作成できます。

f:id:HK29:20201217214642p:plain

コマンドプロンプト等のCUI向け雛形コード
 コマンドライン引数でファイル名を指定します。例えば、本コードのファイル名を「csv2scatter.py」として、処理したいcsvファイル名が「data2.csv」の場合に次のようにして実行します。

$ python csv2scatter.py data2.csv

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 20 # グラフの基本フォントサイズの設定

def main():
    df = pd.read_csv(file_path,
                     header = 0,
                     #skiprows = [1, 2],
                     encoding = 'utf-8',
    )
    fig = plt.figure(dpi=80, figsize=(8,6))
    plt.plot(df[x_name], df[y_name_list]) # 折れ線図
    for y_name in y_name_list:
        plt.scatter(df[x_name], df[y_name]) # 散布図
        
    plt.yscale('linear') # 'linear' 'log'
    plt.ylim(-200, 4000)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title(file_path, fontsize=18)
    plt.legend(y_name_list, loc='upper left', fontsize=18) # 凡例 lower right
    plt.grid(True)
    plt.tight_layout()
    #plt.show()

    plt.savefig(file_name + '.jpg')
    plt.close()

if __name__ == '__main__':
    ### parameter
    file_path = sys.argv[1]
    file_name = os.path.splitext(os.path.basename(file_path))[0]
x_name = 'x' y_name_list = ['y1', 'y2', 'y3'] ### call function main() print("finished")

▼JupyterLabのようなインタラクティブ向け雛形コード

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

# In[1]:


import os, sys
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 20 # グラフの基本フォントサイズの設定

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_name = 'x'
y_name_list = ['y1', 'y2', 'y3']

# グラフ化
fig = plt.figure(dpi=80, figsize=(8,6))

plt.plot(df[x_name], df[y_name_list]) # 折れ線図
for y_name in y_name_list:
    plt.scatter(df[x_name], df[y_name]) # 散布図

plt.yscale('linear') # 'linear' 'log'
plt.ylim(-200, 4000)
plt.xlabel('x')
plt.ylabel('y')
plt.title(file_path, fontsize=18)
plt.legend(y_name_list, loc='upper left', fontsize=18) # 凡例 lower right
plt.grid(True)
plt.tight_layout()
plt.show()

#plt.savefig(root + '.jpg')
#plt.close()

※(参考)2軸設定をしたい場合の雛形コードは次のリンク先を参照下さい。

hk29.hatenablog.jp

以上

<広告>