首页 > 解决方案 > 在 Python 中创建模/折叠图

问题描述

我正在尝试围绕 x 轴上的离散间隔(又名“模图”)“折叠”指数图(并适合它 - 请参见下面的第一张图片)。目的是在 10 个 x 单位之后,指数在 10 到 20 的间隔内从 0 在同一图上继续,如下面的第二张“photoshopped”图像所示。

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 为间隔的模/折叠指数

标签: pythonmatplotlibscipy-optimize

解决方案


您可以尝试简单地编写:

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

但是你会得到令人困惑的线条,将一个部分的最后一点连接到下一个部分的第一个点。

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

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()

结果图


推荐阅读