Python 平均±3σの折れ線図を作成する「matplotlib」

 本記事では、表題のことを成す雛形コードを記載しました。点は平均値で、上下に伸びてるエラーバーがここでは±3σを表します。

f:id:HK29:20210607213515p:plain

グラフ化する例題データは、下図のようなcsvファイルです。A列「month」をx軸にして、B列「data」に対してmonthのカテゴリ別に平均値と3σを計算してY軸にします。

f:id:HK29:20210604235240p:plain

■本プログラム

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

# In[1]:


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

df = pd.read_csv('test_data.csv')
df


# In[2]:


# x軸にしたいデータをリストで抽出する
x_colmun = 'month'
x_list = df.groupby(x_colmun).count().reset_index()[x_colmun].tolist()
print(x_list)
print(type(x_list))


# In[3]:


# 平均値と3σを計算する
mean_list = []
shiguma_list = []
y_column = 'data'
for x in x_list:
    # X軸にしたいカテゴリ別にデータを抽出
    df_buf = df[df[x_colmun] == x]
    # 平均値を計算
    mean_buf = df_buf[y_column].mean()
    mean_list.append(mean_buf)
    # 3σを計算    
    std_buf = df_buf[y_column].std(axis=0) * 3 # 列方向の標準偏差
    shiguma_list.append(std_buf)
    
print(shiguma_list)
print(mean_list)


# In[7]:


# 折れ線図の作成(各点は平均±3σをプロット)
fig = plt.figure(dpi=100)

color = 'b'
plt.scatter(x_list, mean_list, c=color, label='test_A')
plt.errorbar(x_list, mean_list, yerr = shiguma_list, marker = 'o', capthick = 1, capsize = 10, lw = 2, c=color)

#plt.xlabel('X')
plt.ylabel('Y [N]')
plt.title('Y vs X')
# x軸のラベルを変更する
x_list2 = map(lambda x: str(x) + 'mo.', x_list)
plt.xticks(x_list, x_list2)

ax = plt.gca() # get current axes 現在の軸設定データを取得する
ax.set_facecolor('lightyellow') # 背景色の指定'
y_min, y_max = ax.get_ylim()
ax.set_ylim(0, math.ceil(y_max))

# スペックの挿入
y_spec = 3
# x軸の範囲(レンジ)を指定
#ax1.set_xlim(x_min, x_max)
# 横線を入れる
plt.hlines(y_spec, x_list[0], x_list[-1], 'r', linestyles='dashed')
# テキストを挿入する
plt.text(x_list[0], y_spec + 0.1, r'Spec 3[N]', size=18, color='r')

ax.legend(bbox_to_anchor=(1, 0.95)) # 凡例の位置
plt.grid()
plt.show()


# In[ ]:

以上

<広告>