как установить цвета для остаточного участка желтого кирпича - PullRequest
0 голосов
/ 10 октября 2019

Я хочу использовать yellowbrick Residual plot , чтобы показать остатки для модели линейной регрессии. Из документа видно, что Regression_Plot принимает одно значение цвета для наборов обучающих данных.

train_colorcolor, по умолчанию: 'b' Остатки для обучающих данных отображаются этим цветом, но также получаютнепрозрачность 0,5, чтобы
остатки тестовых данных были более заметными. Может быть любого цвета matplotlib.

Мне бы хотелось, чтобы цвета отдельных точек разброса соответствовали сопоставимому графику, где я строю точки регрессии и точки данных.

import numpy as np
from scipy.stats import linregress
import matplotlib.pyplot as plt

from yellowbrick.regressor import ResidualsPlot
from sklearn.linear_model import LinearRegression


data = np.array([[5.71032104e-01, 2.33781600e+03],
       [6.28682565e-01, 2.25247200e+03],
       [1.23262572e+00, 2.82244800e+03],
       [7.44029502e-01, 2.49936000e+03],
       [4.01478749e-01, 2.04825600e+03],
       [3.46455997e-01, 2.32867200e+03],
       [5.15778747e-01, 2.39268000e+03],
       [4.16115498e-01, 2.20218000e+03],
       [3.24103999e-01, 2.07264000e+03],
       [4.29520513e-01, 1.97815200e+03],
       [7.72794999e-01, 2.46278400e+03]])

x = data[:,1]
y = data[:,0]
names = np.array(['COTTONWOOD CREEK', 'EMIGRANT SUMMIT', 'GRAND TARGHEE',
       'PHILLIPS BENCH', 'PINE CREEK PASS', 'SALT RIVER SUMMIT',
       'SEDGWICK PEAK', 'SLUG CREEK DIVIDE', 'SOMSEN RANCH',
       'WILDHORSE DIVIDE', 'WILLOW CREEK'], dtype=object)
colors = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a','#ffff99']


slope, intercept, r_value, p_value, std_err = linregress(x ,y)
xHat = np.linspace(x.min()-300,x+300, 100 )
yHat = y * slope +intercept

colors = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a','#ffff99']

fig,(ax,ax1) = plt.subplots(nrows=2)
for name, x_, y_, color in zip(names, x, y, colors):
    ax.scatter(x_, y_, label = name, c = color)
ax.plot(xHat, xHat*slope + intercept, 'k--', marker=None)
ax.set_xlim(x.min()-200,x.max()+200)
leg = ax.legend(fontsize='x-small', loc='lower right')
ax.text(1934,1.27,'y=' + str(np.round(slope,6))+'x'+ str(np.round(intercept, 3)))
ax.text(1934,1.1, 'R$^2$ =' + str(np.round(r_value**2,4)))


linreg = LinearRegression()
vizul  = ResidualsPlot(linreg, hist=False)
vizul.fit(x.reshape(-1,1) ,y.reshape(-1,1))
vizul.poof(ax=ax1)
plt.tight_layout()

enter image description here

Возможно ли достичь этого без использования базового matplotlib для остаточного графика?

Спасибо.

...