使用 matplotlib (Python) 中的颜色网格绘制与 'real' 路径的随机轨迹偏差

Plot stochastic trajectories deviations from 'real' path using a colormesh in matplotlib (Python)

你好,我创建了一个程序,它会产生与真实轨迹的偏差,它很复杂,不幸的是我没有一个简单的例子。

它从真实路径计算出一条具有随机初始条件的路径,并进行 x 次迭代,目的是表明偏差会随着时间的推移而变大。

真实路径和偏差如下图所示。

但是我想表明,时间越长,偏差就越大。当然,我可以在每个时间步计算方差并绘制 mean+var 和 mean-var,但我想知道我是否可以使用 hist2d

绘制这样的图

你看积木不是那么光滑,这不是很好用。

然后我去查看 python 的 kde 并创建了以下内容。

这也不是可取的,因为我认为它在最小值和最大值处放置了更多点。也是'too smeared out'。尤其是在开始的时候,所有的点都是一样的,所以我只希望有一条直线来真正表明偏差是后来开始的。

我想我的问题是;是我什至想要的,我应该使用什么 package/command 。我还没有找到我在其他问题上寻找的东西。或者有人建议以任何其他方式很好地展示我想要的东西吗?

您可以使用类似 matplotlib.pyplot.fill_between 的方法。对于给定的(公共)x 数组,它填充 y1(最大值)和 y2(最小值)之间的所有内容。然后您将能够强调填充区域随着 x 值的增加而不断扩大。

但是,这需要您在每个时间点找到偏差的最小值和最大值,并将它们保存到两个单独的数组中。执行此操作的确切方法将取决于您如何存储这些单独的运行。

如果它们是单独的列表/数组,您可以将它们转换为 numpy 矩阵/pandas 数据框,并沿相关轴使用最小值/最大值方法。

这是一个绘制多条透明曲线的想法:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 200)
for _ in range(1000):
    plt.plot(x, np.sin(x * np.random.normal(1, 0.1)) * np.random.normal(1, 0.1), color='r', alpha=0.02)
plt.plot(x, np.sin(x), color='b')
plt.margins(x=0)
plt.show()

另一个创建二维直方图的选项:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 200)
all_curves = np.array([np.sin(x * np.random.normal(1, 0.1)) * np.random.normal(1, 0.1) for _ in range(100)])
plt.hist2d(x=np.tile(x, all_curves.shape[0]), y=all_curves.ravel(), bins=(100, 100), cmap='inferno')
plt.show()

另一种方法是在置信区间之间使用 fill_between(如@bramb 所建议的):

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 200)
all_curves = np.array([np.sin(x * np.random.normal(1, 0.1)) * np.random.normal(1, 0.1) for _ in range(1000)])

confidence_interval1 = 95
confidence_interval2 = 80
confidence_interval3 = 50
for ci in [confidence_interval1, confidence_interval2, confidence_interval3]:
    low = np.percentile(all_curves, 50 - ci / 2, axis=0)
    high = np.percentile(all_curves, 50 + ci / 2, axis=0)
    plt.fill_between(x, low, high, color='r', alpha=0.2)
plt.plot(x, np.sin(x), color='b')
plt.margins(x=0)
plt.show()