Если вы действительно хотите иметь ту же кривую, вы можете загрузить изображение графика и использовать PIL для получения каждого синего пикселя:
from urllib.request import urlopen
from PIL import Image
img = Image.open(urlopen('https://i.stack.imgur.com/NpiMq.png'))
X = []
Y = []
for x in range(img.size[0]):
for y in range(img.size[1]):
r, g, b, a = img.getpixel((x, y))
if b > r and b > g:
X.append(x)
Y.append(y)
Затем, зная, что (0, 20) на графике - это пиксель (63, 355), а (25, 160) на графике - это пиксель (516, 32), вы можете преобразовать координаты пикселя в точки данных. :
X = [(x - 63) * (25 - 0) / (516 - 63) + 0 for x in X]
Y = [(y - 355) * (160 - 20) / (32 - 355) + 20 for y in Y]
Наконец, вы можете использовать nimpy polyfit, чтобы получить полиномиальную подгонку к полученным ранее точкам:
>>> np.polyfit(X, Y, 3)
[ 8.23918277e-03 -7.33330644e-02 2.60046715e+00 2.03012850e+01]
И затем выведите на график результат, используя poly1d
, чтобы получить функцию, которая с указанным значением x
возвращает свое значение y
:
import numpy as np
from matplotlib import pyplot as plt
x2y = np.poly1d(np.polyfit(X, Y, 3))
new_X = [x / 10 for x in range(250)]
new_Y = [x2y(x) for x in new_X]
plt.plot(new_X, new_Y)
plt.show()
