本記事では下図のような散布図を作成する雛形コードを作成しました。これは、seabornのregplotメソッドで、x_jitterを使用することでできます。jitterはゆらぎです。
上記の元データは下図のようなcsvです。x列が横軸にプロットするx値、y列が縦軸にプロットするy値です。
■本プログラム
#!/usr/bin/env python # coding: utf-8 # In[1]: import pandas as pd df = pd.read_csv('test_data.csv') df # In[2]: import numpy as np from scipy import optimize import math #import matplotlib #matplotlib.use('Agg') import matplotlib.pyplot as plt import seaborn as sns # 近似式 y = ax + b 用の関数AB def approximation_expression_AB(x, a, b): return a * x + b def plot_reg_AB(DF, X_name, Y_name): # 近似式の作成 popt, pcov = optimize.curve_fit(approximation_expression_AB, DF[X_name], DF[Y_name]) ax = plt.figure(num=0, dpi=120).gca() #plt.rcParams["axes.labelsize"] = 15 ax.set_title("title", fontsize=14) ax.set_xlabel(X_name, fontsize=16) ax.set_ylabel(Y_name, fontsize=16) rp = sns.regplot(X_name, Y_name, df, color = 'b', x_jitter = 0.12, scatter_kws = {'alpha':0.5}, line_kws = {'linestyle':':'}) # Xデータの最小値と最大値 x_min = DF[X_name].min() x_max = DF[X_name].max() # Yデータの最小値と最大値 y_min = DF[Y_name].min() y_max = DF[Y_name].max() # グラフのレンジを決める ''' x_range = x_max - x_min # データの範囲が100以下か以上かで分ける print("x_range = x_max - x_min = " + str(x_range)) if x_max > 1: min_lim = 0 if x_range <= 10: max_lim = math.floor(x_max + 1) else: max_lim = math.floor(x_max + 10) rp.axes.set_xlim(min_lim, max_lim) rp.axes.set_ylim(min_lim, max_lim) else: max_lim = 0 if x_range <= 100: max_lim = math.floor(x_max - 1) else: max_lim = math.floor(x_max - 10) rp.axes.set_xlim(min_lim, max_lim) rp.axes.set_ylim(min_lim, max_lim) ''' # 近似式プロットのためのデータを作成 x_approximation = np.linspace(x_min, x_max, 10) # numpyでxデータを作成 print(x_approximation) y_approximation = popt[0] * x_approximation + popt[1] # 近似式に代入してyデータを作成 line_approximation = ax.plot(x_approximation, y_approximation, linestyle = 'dashed', linewidth = 3, color='r') #rp.axes.set_aspect('equal', adjustable='box') plt.grid(True) # 凡例を指定して記入する場合は、リストで指定する ax.legend([line_approximation[0]], ["y = {0:.2f}x + {1:.2f}".format(popt[0], popt[1])], loc='upper left', numpoints=1, fontsize=15) plt.tick_params(labelsize=15) plt.tight_layout() #plt.savefig(save_fname + '_real_vs_pred.png') #plt.close() plt.show() plot_reg_AB(df, 'x', 'y') # In[ ]:
以上
<広告>
リンク