在Python中创建模/折叠图

在Python中创建模/折叠图,python,matplotlib,scipy-optimize,Python,Matplotlib,Scipy Optimize,我试图围绕x轴上的离散间隔(也称为“模图”)将指数图(及其拟合-见下图)进行“折叠”。其目的是,在10个x单位之后,指数在相同的图上从0持续10到20个间隔,如下面的第二张“Photoshop”图像所示 MWE代码如下: import numpy as np from scipy import optimize import matplotlib.pyplot as plt 生成点 适合数据 绘图数据和拟合函数 你可以试着简单地写: ax.plot(x%10,y,c='g',label=“D

我试图围绕x轴上的离散间隔(也称为“模图”)将指数图(及其拟合-见下图)进行“折叠”。其目的是,在10个x单位之后,指数在相同的图上从0持续10到20个间隔,如下面的第二张“Photoshop”图像所示

MWE代码如下:

import numpy as np
from scipy import optimize
import matplotlib.pyplot as plt
生成点 适合数据 绘图数据和拟合函数


你可以试着简单地写:

ax.plot(x%10,y,c='g',label=“Data”)
ax.plot(x%10,f,c='r',linestyle=“:”,label=“Fit”)
但是你会发现一段的最后一点和下一段的第一点之间有一条混乱的线

另一个想法是创建一个循环,分别绘制每个零件。为了避免多个图例条目,只有第一部分设置了图例标签

将numpy导入为np
从scipy导入优化
将matplotlib.pyplot作为plt导入
x=np.arange(40)
y=np.exp(-x/10)
def fit_func(x,t):
返回np.exp(-x/t)
PAR,PCOV=优化.CurvyFIT(F=FITY-FUNC,XDATA=X,YDATABY=Y)
f=拟合函数(x,par)
图,ax=plt.子批次()
左=x.min()
截面=1
当左filter=(x>=左)和(x假设
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()
这就是结果图:


谢谢你,约翰!这正是我想要的!谢谢你,莫森·法特米!另一个伟大的解决方案。
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)
>>> 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()