Создание модуля / сложенного графика в Python - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь «сложить» экспоненциальный график (и подгонку к нему - см. Первое изображение ниже) вокруг дискретного интервала по оси X (он же «график по модулю»). Цель состоит в том, чтобы после 10 x-единиц экспонента продолжалась на том же графике от 0 для интервала 10–20, как показано на втором изображении с фотошопом ниже.

Код MWE приведен ниже:

import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt

Создание точек

x=np.arange(20)
y=np.exp(-x/10)

Соответствие данным

def fit_func(x, t):
    return np.exp(-x/t)
par, pcov = optimize.curve_fit(f=fit_func, xdata=x, ydata=y)

Данные графика и функция подгонки

fig, ax = plt.subplots()
ax.plot(x,y, c='g', label="Data");
ax.plot(x,fit_func(x, par), c='r', linestyle=":", label="Fit");
ax.set_xlabel("x (modulo 10)")
ax.legend()
plt.savefig("fig/mod.png", dpi=300)

Что я есть: экспоненциальная по Оригиану от 0 до 20

Что я хочу: по модулю / сложенная экспонента с интервалами 10

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Предполагая, что x является отсортированным массивом, у нас будет:

>>> y_ = fit_func(x, par)
>>> temp_x = []
>>> temp_y = []
>>> temp_y_ = []
>>> fig, ax = plt.subplots()
>>> for i in range(len(x)):
    if x[i]%10==0 or i == len(x)-1:
        ax.plot(temp_x,temp_y, c='g', label="Data");
        ax.plot(temp_x,temp_y_, c='r', linestyle=":", label="Fit")
        temp_x,temp_y,temp_y_ = [],[],[]
    else:
        temp_x.append(x[i]%10)
        temp_y.append(y[i])
        temp_y_.append(y_[i])
>>> plt.show()

, и это будет результирующий график:

enter image description here

0 голосов
/ 31 января 2020

Вы можете попытаться просто написать:

ax.plot(x % 10,y, c='g', label="Data")
ax.plot(x % 10, f, c='r', linestyle=":", label="Fit")

, но тогда вы получите запутанные линии, соединяющие последнюю точку одного раздела с первой точкой следующего.

Другая идея состоит в том, чтобы создайте al oop для построения каждой части отдельно. Чтобы избежать нескольких записей легенды, только первый раздел устанавливает метку легенды.

import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt

x=np.arange(40)
y=np.exp(-x/10)
def fit_func(x, t):
    return np.exp(-x/t)

par, pcov = optimize.curve_fit(f=fit_func, xdata=x, ydata=y)
f = fit_func(x, par)
fig, ax = plt.subplots()

left = x.min()
section = 1
while left < x.max():
    right = left+10
    filter = (x >= left) & (x <= right)
    ax.plot(x[filter]-left,y[filter], c='g', label="Data" if section == 1 else '')
    ax.plot(x[filter]-left, f[filter], c='r', linestyle=":", label="Fit" if section == 1 else '')
    left = right
    section += 1

ax.set_xlabel("x (modulo 10)")
ax.legend()
#plt.savefig("fig/mod.png", dpi=300)
plt.show()

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...