Как ограничить длину линии на графике, показывающем линейную регрессию? - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь создать график из данных Excel (2 столбца, один для оси x, а другой для оси y) и показать медиану, среднее значение и линию тренда (линейная регрессия).

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

В зависимости от значений 2-го столбца, иногда он бывает коротким и почти горизонтальным, но для одного набора данных он начинается где-то в середине графика и опускается ниже самой нижней точки на графике, визуально расширяя график, и он выглядит плохо.

Мой вопрос: как ограничить длину линии на графике, показывающем линейную регрессию?

Вот скриншот до и после:

А после добавления: np.clip

Я аккуратно обрезал нижнюю часть линии, но вместо того, чтобы полностью ограничить ее ниже определенной точки, я просто ограничил ее значения y, и она превратилась в горизонтальную линию с этим значением y. Это было сделано просто путем ограничения значения функции, отображающей значения y линии тренда линейной регрессии, но я не знаю, как это сделать и для значений x.

colors = np.where(x<reasonablemin,'k',np.where(x>reasonablemax,'k','y'))
plt.title(plottitle)
ax = plt.axes()
plt.gca().invert_yaxis()
ax.scatter(x, y, c=colors) 
finalx = [x for x in x if ((x < reasonablemax) & (x > reasonablemin))]
mask = (x[1:-1] > reasonablemax)
x[1:-1][mask] = np.nan
mask = (x[1:-1] < reasonablemin)
x[1:-1][mask] = np.nan
clearedagain = cleared.dropna()
print(clearedagain)
x = cleared[parameter]
y = cleared['Depth']
xcleared = clearedagain[parameter]
ycleared = clearedagain['Depth']
x = x.values.reshape(len(x), 1)
y = y.values.reshape(len(y), 1)
xcleared = xcleared.values.reshape(len(xcleared), 1)
ycleared = ycleared.values.reshape(len(ycleared), 1)
model = LinearRegression()
model.fit(xcleared, ycleared)
x_linearregression = np.linspace(0, reasonablemax)
y_linearregression = model.predict(x_linearregression[:, np.newaxis])
print(y_linearregression)
minimum = min(ycleared)
maximum = max(ycleared)
np.clip(y_linearregression, minimum, maximum, out=y_linearregression)
print(y_linearregression)
linear_regression_line = ax.plot(x_linearregression, y_linearregression, 
label='Trendline', linestyle='dotted')
plt.ylim(max(ycleared)+1,min(ycleared-1))
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
ax.axis('tight')
plt.show()

Просто чтобы отрезать эту линию на уровне самой низкой точки. И также самый высокий, если набор данных был наоборот.

...