Как разместить набор равномерно распределенных параллельных линий в сетке данных - PullRequest
0 голосов
/ 11 марта 2020

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

Вот что у меня получилось:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3])
y1 = np.array([60.8, 60.5, 60.5])
y2 = np.array([377.6, 376.8, 377.7])
y3 = np.array([695.4, 695.8, 695.5])

fit_1 = np.polyfit(x,y1,0)
fit_2 = np.polyfit(x,y2,0)
fit_3 = np.polyfit(x,y3,0)

plt.plot(x,y1,'*',x,y2,'*',x,y3,'*')
for line in fit_1,fit_2,fit_3:
    plt.axhline(line, color='r')

Параллельные линии соответствуют горизонтальным данным:

parallel lines fit to horizontal data

Есть ли у кого-нибудь идеи о том, как я могу ограничить расстояние между каждой последующей параллельной линией?

Спасибо!

1 Ответ

0 голосов
/ 11 марта 2020

Если вы преобразуете свои данные, как показано ниже, вы можете построить линию для этого

xNew=[0, 0, 0, 1, 1, 1, 2, 2, 2]
y =np.concatenate([y1,y2,y3]) 

Эта линия будет y = mx + c, где в этом подгонке x является индексом набора данных.

Таким образом, мы можем сказать, например, y1 = m * 0 + c, y2 = m * 1 + c et c

, вы можете использовать это для регулировки y1, y2 , y3, затем подгоните линии и начертите, как вы делали

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3])
y1 = np.array([60.8, 60.5, 60.5])
y2 = np.array([377.6, 376.8, 377.7])
y3 = np.array([695.4, 695.8, 695.5])

xNew=[0, 0, 0, 1, 1, 1, 2, 2, 2]
y =np.concatenate([y1,y2,y3]) 

fit = np.polyfit(xNew,y, 1)
y1New = [fit[0]*0 + fit[1]] *3
y2New = [fit[0]*1 + fit[1]] *3
y3New = [fit[0]*2 + fit[1]] *3

fig = plt.figure(num="LIVE", figsize=(14, 6), dpi=80, facecolor='w', edgecolor='k')
plt.plot(x,y1,'*',x,y2,'*',x,y3,'*')
for line in y1New,y2New,y3New:
    plt.plot(x, line, color='r')

Этот ответ будет иметь такой же интервал, что и средний интервал ваших 3 подгонок, но он поможет вам найти точные линии, а не только интервал, используйте этот код, чтобы увидеть разницу (я настроил y3 [2], чтобы показать это здесь)

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1, 2, 3])
y1 = np.array([60.8, 60.5, 60.5])
y2 = np.array([377.6, 376.8, 377.7])
y3 = np.array([695.4, 695.8, 800])

xNew=[0, 0, 0, 1, 1, 1, 2, 2, 2]
y =np.concatenate([y1,y2,y3]) 

fit = np.polyfit(xNew,y, 1)
y1New = [fit[0]*0 + fit[1]] *3
y2New = [fit[0]*1 + fit[1]] *3
y3New = [fit[0]*2 + fit[1]] *3

fig = plt.figure(num="LIVE", figsize=(14, 6), dpi=80, facecolor='w', edgecolor='k')
plt.plot(x,y1,'*',x,y2,'*',x,y3,'*')
for line in y1New,y2New,y3New:
    plt.plot(x, line, color='r')


fit_1 = np.polyfit(x,y1,0)
fit_2 = np.polyfit(x,y2,0)
fit_3 = np.polyfit(x,y3,0)

for line in fit_1,fit_2,fit_3:
    plt.axhline(line, color='b')

print(float((fit_3 - fit_1)/2))
print(fit[0])
...