本記事では下図の凡例(legend)のRMのようにカテゴリ変数を指定数に分割して作成する。またそれを散布図にする雛形コードを載せました。
下図中にある列名「RM」のデータから、列名「label」というカテゴリ変数を作成します。それを上図のようにカテゴリ別に色を変えてプロットします。
■本プログラム
#!/usr/bin/env python # coding: utf-8 # In[1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm plt.rcParams['font.size'] = 18 # グラフの基本フォントサイズの設定 # csvファイルをpandasデータフレームで読み込む df = pd.read_csv('boston_XYdata.csv') df # In[2]: # カテゴリ変数にする列データをリストで取得する legend_name = 'RM' legend_list = df[legend_name].tolist() print(legend_list) # In[3]: # データの最小と最大を抽出する data_min = min(legend_list) data_max = max(legend_list) print(data_min, data_max) # In[4]: # カテゴリ変数作成に当たって、区分する数を指定する。ここでは3 # 区間の間隔を算出する n_split = 3 data_delta = (data_max - data_min) / n_split data_delta # In[5]: # 指定した区間の値を算出 x1_list = list(np.arange(data_min, data_max + 0.1, data_delta)) print(len(x1_list)) x1_list # In[6]: # 各区間の最小と最大をリスト化する # まず、リスト内要素をひとつずらした新規リストを2つ作成する n = 1 x2_list = x1_list[n:] + x1_list[:n] # 要素のインデックスをひとつずらす print(x2_list) # リストの先頭にあった要素が一番最後に移る x1_list.pop() # リストの末尾の要素を削除 x2_list.pop() print(x1_list, x2_list) # ひとつずれたリストが二つできる # In[7]: # 上記二つのリストを用いて、2つずつをひとつずらしずつ取り出す range_list = [] for x1, x2 in zip(x1_list, x2_list): range_list.append([x1, x2]) print(len(range_list)) range_list # In[8]: # カテゴリ変数を列名「label」として作成する df_list = [] for _ in range_list: my_min, my_max = _ df_buf = df[(df[legend_name] >= my_min) & (df[legend_name] < my_max)] df_buf['label'] = '{0:.1f}'.format(my_min) + '<=' + legend_name + '<' + '{0:.1f}'.format(my_max) df_list.append(df_buf) #df_list # In[9]: # 作成したカテゴリ変数「label」を元のデータフレームに追記する DF = pd.concat(df_list) DF # In[10]: # カテゴリ変数を凡例に、散布図を作成する。 x_name = 'LSTAT' y_name = 'PRICE' label = 'label' title = 'boston_data' fig = plt.figure(dpi=80, figsize=(6,4)) # ひとつの散布図にカテゴリ別にプロットする handle_list = [] for i, legend in enumerate(DF[label].unique()): print(i, legend) plt.scatter(DF.loc[DF[label] == legend, x_name], DF.loc[DF[label] == legend, y_name], facecolor = 'None', #facecolor = cm.cool(i / len(DF[label].unique())), #'None' edgecolors = cm.cool(i / len(DF[label].unique())), label = legend) plt.legend(bbox_to_anchor = (1, 1), title = legend_name) plt.xlabel(x_name) plt.ylabel(y_name) plt.title(title) ''' x_min = 0 x_max = 20 y_spec = 150 ''' # x軸の範囲(レンジ)を指定 #plt.xlim(x_min, x_max) # 横線を入れる #plt.hlines(y_spec, x_min, x_max, 'r', linestyles='dashed') # テキストを挿入する #plt.text(x_min, y_spec + 10, r'Spec 150[MPa]', size=18, color='r') plt.grid() plt.tick_params() #plt.tight_layout() plt.show() #plt.savefig('picture.jpg') #plt.close() # In[ ]:
以上
<広告>
リンク