Python 重複プロット点を避ける散布図+近似式

 本記事では下図のような散布図を作成する雛形コードを作成しました。これは、seabornのregplotメソッドで、x_jitterを使用することでできます。jitterはゆらぎです。

f:id:HK29:20211003235635p:plain

上記の元データは下図のようなcsvです。x列が横軸にプロットするx値、y列が縦軸にプロットするy値です。

f:id:HK29:20211003235854p:plain

 

■本プログラム

#!/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[ ]:

以上

<広告>