Я хочу построить линии (остатки; голубые линии) между точками данных и предполагаемой моделью. В настоящее время я делаю это, перебирая все точки данных в моем доходе pandas.DataFrame и добавляя вертикальные линии. x, y - координаты точек, а predicted - прогнозы (здесь синяя линия).
plt.scatter(income["Education"], income["Income"], c='red')
plt.ylim(0,100)
for indx, (x, y, _, _, predicted) in income.iterrows():
plt.axvline(x, y/100, predicted/100) # /100 because it needs floats [0,1]
Есть ли более эффективный способ? Это не кажется хорошим подходом для более чем нескольких строк.






Прежде всего отметим, что axvline здесь работает только случайно. Как правило, значения y, принимаемые axvline, находятся в координатах относительно осей, а не в координатах данных.
Напротив, vlines использует координаты данных, а также имеет преимущество принимать массивы значений. Затем он создаст LineCollection, который более эффективен, чем отдельные линии.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1.2,1.2,20)
y = np.sin(x)
dy = (np.random.rand(20)-0.5)*0.5
fig, ax = plt.subplots()
ax.plot(x,y)
ax.scatter(x,y+dy)
ax.vlines(x,y,y+dy)
plt.show()
Не совсем совпадение, так как я намеренно установил plt.ylim(0,100), а затем разделил на 100, но я понимаю вашу точку зрения, это патч - неправильный подход. В любом случае, спасибо за ваш вклад!
axvlineпринимает только скаляры, ноvlinesпринимает также одномерные массивы. Затем вы также можете напрямую построить свои значения и не нуждаться в преобразовании (0, 1).