Python グラフの凡例に指定したい色を設定する

'21/12/05更新:折れ線図だけの場合の雛形コードも追記しました。
 本記事では、凡例(legend)の順番に従って段階的に変化した色を適応したい場合の雛形コードを載せました。
 下図の例では、凡例が0, 1, 2の3つあります。これらが水色から紫へと段階的に変化した色を設定しています。方法は、import matplotlib.cm as cmを使用して、cm.coolやcm.jet、cm.autumnなどを活用します。

f:id:HK29:20211130214748p:plain

上図は、下図データのような3つのcsvファイルの各々のx,y1, y2の3つの列をプロットしたグラフです。ここでは、色の違いはファイルの違いで設定しています。

f:id:HK29:20211130215559p:plain

■本プログラム

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

# In[1]:


import glob
import re
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import japanize_matplotlib
plt.rcParams["font.size"] = 18

# 複数ファイルをリストに格納
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]:


cnt = len(file_list)
# プロットするカラーを指定するための処理
color_list = []
for j in range(cnt):
    color_list.append(cm.cool(j/cnt)) # jet cool autumn
color_list


# In[3]:


# x軸,y軸に設定する列名を指定
x_name_list = ['x', 'x']
y_name_list = ['y1', 'y2']

fig = plt.figure(dpi=80, figsize=(8,6))

legend_list = []
handle_list = []
for i, file in enumerate(file_list):
    legend_list.append(i)
    DF = pd.read_csv(file, encoding='cp932')
    
    # 散布図と折れ線図の作成
    for k, (x_name, y_name) in enumerate(zip(x_name_list, y_name_list)):
        plt.plot(DF[x_name], DF[y_name], c=color_list[i]) # 折れ線図
        p = plt.scatter(DF[x_name], DF[y_name], color=color_list[i])# 散布図
        if k == 0:
            # 凡例に指定した色を設定するため、オブジェクトをリストに格納
            handle_list.append(p) 

plt.yscale('linear')
plt.ylim(-100, 10000)
plt.title("graph")
plt.xlabel('x')
plt.ylabel('y')
plt.grid(which="both")
plt.legend(handles = handle_list,
           labels = legend_list,
           bbox_to_anchor=(1.00, 0.9),
           title = 'mylegend')
plt.tight_layout()
plt.show()
#plt.savefig(file_name + '.jpg')
#plt.close()

下図のような折れ線図だけにしたい場合の雛形コードは次の通りです。

f:id:HK29:20211205235404p:plain

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

# In[1]:


import glob
import re
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import japanize_matplotlib
plt.rcParams["font.size"] = 18

# 複数ファイルをリストに格納
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]:


cnt = len(file_list)
# プロットするカラーを指定するための処理
color_list = []
for j in range(cnt):
    color_list.append(cm.cool(j/cnt)) # jet cool autumn
color_list


# In[3]:


# x軸,y軸に設定する列名を指定
x_name_list = ['x', 'x']
y_name_list = ['y1', 'y2']

fig = plt.figure(dpi=80, figsize=(8,6))

legend_list = []
handle_list = []
for i, file in enumerate(file_list):
    legend_list.append(i)
    DF = pd.read_csv(file, encoding='cp932')
    
    # 散布図と折れ線図の作成
    for k, (x_name, y_name) in enumerate(zip(x_name_list, y_name_list)):
        p, = plt.plot(DF[x_name], DF[y_name], c=color_list[i]) # 折れ線図
        #p = plt.scatter(DF[x_name], DF[y_name], color=color_list[i])# 散布図
        if k == 0:
            # 凡例に指定した色を設定するため、オブジェクトをリストに格納
            handle_list.append(p) 

plt.yscale('linear')
plt.ylim(-100, 10000)
plt.title("graph")
plt.xlabel('x')
plt.ylabel('y')
plt.grid(which="both")
plt.legend(handles = handle_list,
           labels = legend_list,
           bbox_to_anchor=(1.00, 0.9),
           title = 'mylegend')
plt.tight_layout()
plt.show()
#plt.savefig(file_name + '.jpg')
#plt.close()

以上

<広告>