python - 在 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)
解决方案
您可以尝试简单地编写:
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()
推荐阅读
- python - 无法导入 TensorFlow v1.12
- c# - GetAttribute("class") 不提供任何类名
- javascript - 使用多个过滤器重新渲染组件
- python-3.x - Windows Python 3.7 上的 pyrebase 安装失败
- c++ - 使用与构造函数中矩阵的列相对应的索引填充向量的最有效方法?
- drupal-8 - 如何加快 ddev Drupal 8 项目的前几页速度?
- r - 如何在 httr 包中传递 curl -F 参数?
- r - 在数据集中搜索名称模式
- git - 我必须在 Visual Studio 2017 中安装 git 吗?
- c# - 报告我的软件无法在 Windows 7 / 32 位上运行