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

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

■本プログラム
import pandas as pd
df = pd.read_csv('test_data.csv')
df
import numpy as np
from scipy import optimize
import math
import matplotlib.pyplot as plt
import seaborn as sns
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()
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_min = DF[X_name].min()
x_max = DF[X_name].max()
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)
print(x_approximation)
y_approximation = popt[0] * x_approximation + popt[1]
line_approximation = ax.plot(x_approximation, y_approximation,
linestyle = 'dashed', linewidth = 3, color='r')
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.show()
plot_reg_AB(df, 'x', 'y')
以上
<広告>
リンク