Как мне расширить линию тренда на графике matplotlib?

#python #matplotlib #data-science

#python #matplotlib #наука о данных

Вопрос:

Вот часть графика, которая у меня есть

Мне нужно создать линию тренда, которая будет расширена до 3-й четверти этого графика… Я могу придумать любое решение.

 import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings('ignore')

x = [1, 8, 12, 20]
y = [1, 8.4, 12.5, 20]

fig = plt.figure(figsize=(20,20))
ax = fig.add_subplot()
ax.set_xlim(-30, 30)
ax.set_ylim(-20, 20)

plt.subplot().spines['left'].set_position('center')
plt.subplot().spines['bottom'].set_position('center')
plt.plot(x,y, 'b.', ms=20)
plt.minorticks_on()
ax.grid(True, which='both')
mean_line = ax.plot()
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x,p(x),"r--")

plt.show()
  

Ответ №1:

Я не думаю, что обратные x и y выполнят эту работу, она будет ограничена poly1d, который передает (0,0) Я думаю, что метод расширения должен использовать саму установленную линию.

итак, более общий метод — расширить x и использовать poly1d(z) для вычисления расширенной линии. z — это описание подогнанной линии, поэтому добавление значения x в z приведет к построению линии.

 import matplotlib.pyplot as plt
import numpy as np
import warnings

warnings.filterwarnings('ignore')

x = [1, 8, 12, 20]
y = [1, 8.4, 12.5, 20]

# make an xx that with from -20 to 20
#xx =np.array(x)
#xx = sorted(np.concatenate((-xx, xx), axis=0))
xx = [-20, 20] # also work


fig, ax = plt.subplots(figsize=(10,10))
ax.set_xlim(-30, 30)
ax.set_ylim(-20, 20)

plt.subplot().spines['left'].set_position('center')
plt.subplot().spines['bottom'].set_position('center')
plt.subplot().spines['right'].set_color('none')
plt.subplot().spines['top'].set_color('none')


plt.plot(x,y, 'b.', ms=20)
plt.minorticks_on()
#ax.grid(True, which='both')
plt.subplot().grid(True, which='both')
mean_line = ax.plot()
z = np.polyfit(x, y, 1)
p = np.poly1d(z)

plt.plot(xx,p(xx),"r--")

plt.show()
  

если вы увеличите масштаб рядом с (0,0), вы должны увидеть, что он не проходит начальную точку.

увеличено почти (0,0)

изображение результата

Ответ №2:

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

 import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings('ignore')

x = [1, 8, 12, 20]
y = [1, 8.4, 12.5, 20]

fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot()
ax.set_xlim(-30, 30)
ax.set_ylim(-20, 20)

plt.subplot().spines['left'].set_position('center')
plt.subplot().spines['bottom'].set_position('center')
plt.plot(x,y, 'b.', ms=20)
plt.minorticks_on()
ax.grid(True, which='both')
mean_line = ax.plot()

#  update
xx =np.array(x)
xx = sorted(np.concatenate((-xx, xx), axis=0))
yy =np.array(y)
yy = sorted(np.concatenate((-yy, yy), axis=0))

z = np.polyfit(xx, yy, 1)
p = np.poly1d(z)
plt.plot(xx,p(xx),"r--")

plt.show()
  

введите описание изображения здесь

Комментарии:

1. Спасибо! это именно то, что мне было нужно