Я пытаюсь добавить на график кубическую функцию вместо линейной линии тренда.

X и y — это списки данных, и они прекрасно отображаются с линейной линией тренда.
Я также хотел бы добавить кубическую линию тренда.

import matplotlib.pyplot as plt
x = (distanceList)
y = (percentCopper)
plt.scatter(x,y) 
title = "trendLine"
xLabel = "Distance m"
yLabel = "percent copper"
plt.title (title, fontsize=10);
plt.ylabel(yLabel, fontsize=10);
plt.xlabel(xLabel, fontsize=10);
fit = np.polyfit(x,y,1)
fit_fn = np.poly1d(fit) 
plt.plot(x, y, '.', x, fit_fn(x), 'r')
plt.xlim(0, 50)
plt.ylim(0, 2.5)
plt.show()

person R Rip    schedule 21.03.2017    source источник
comment
У вас на самом деле нет вопроса здесь. С какой именно частью добавления кубической линии тренда у вас возникли проблемы? Вам нужно вычислить подгонку или построить обе подгонки вместе или что-то еще?   -  person Tuffwer    schedule 21.03.2017
comment
Я должен построить линейную линию соответствия и кубическую функцию   -  person R Rip    schedule 21.03.2017
comment
Я думаю, что этот существующий вопрос должен охватывать все, что вам нужно, чтобы добавить кубическую подгонку к вашему графику "> stackoverflow.com/questions/18767523/fitting-data-with-numpy   -  person Tuffwer    schedule 21.03.2017


Ответы (1)


Просто используйте np.polyfit(x,y,3) и добавьте его на график, как в приведенном ниже коде:

import matplotlib.pyplot as plt
import numpy as np
x = np.array(range(50))
y = x**3/5000.0-x/5000.0
plt.scatter(x,y) 
title = "trendLine"
xLabel = "Distance m"
yLabel = "percent copper"
plt.title (title, fontsize=10);
plt.ylabel(yLabel, fontsize=10);
plt.xlabel(xLabel, fontsize=10);
fit = np.polyfit(x,y,1)
fit3 = np.polyfit(x,y,3)
fit_fn = np.poly1d(fit) 
fit_fn3 = np.poly1d(fit3)
plt.plot(x, y, '.', x, fit_fn(x), fit_fn3(x), 'r')
plt.xlim(0, 50)
plt.ylim(0, 2.5)
plt.show()

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

person Miriam Farber    schedule 21.03.2017
comment
Это не будет работать правильно, потому что функция polyfit возвращает список коэффициентов в полином для в порядке, обратном тому, в котором их ожидает poly1d. Как указано в верхнем ответе на связанный пост в моем комментарии к вопросу, который вам нужно измените этот порядок в списке или используйте функцию Polynomial вместо poly1d. - person Tuffwer; 21.03.2017
comment
@Tuffwer Ты уверен? Я заменил y на y = x**3/5000.0-x/5000.0, чтобы немного усложнить задачу, и прикрепляю график. Кажется, это правильная установка, не так ли? - person Miriam Farber; 21.03.2017
comment
Ну, я был... Прошлой ночью я потратил около 15 минут на чтение документации и клянусь, что прочитал именно это. Повторное чтение polyfit и poly1d теперь кажется, что заказы совпадают, и я полностью ошибся. Извините, примите мой голос. - person Tuffwer; 21.03.2017