使用matplotlib(Python)中的彩色网格绘制与“真实”路径的随机轨迹偏差

2024-09-29 23:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我创建了一个程序,将创建一个真正的轨迹偏差,这是复杂的,我没有一个简单的例子不幸

它从实际路径计算具有随机初始条件的路径,并在x次迭代中执行此操作,目的是显示偏差随着时间的增加而增大

实际路径和偏差如下所示。 noise

然而,我想说明的是,时间越长,偏差越大。当然,我可以计算方差,并在每个时间步绘制均值+var和均值-var,但我想知道是否可以使用hist2d绘制类似的图

hist2d

你可以看到,这些块并不像一个样的平滑,这不是很好的使用

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

enter image description here

这也是不可取的,因为我认为它在最小值和最大值处有更多的点。而且它“太脏了”。特别是在开始的时候,所有的点都是一样的,所以我希望这里有一条直线来真正显示偏差是从后面开始的

我想我的问题是;我想要的是可能的,我应该使用什么包/命令。我还没有在其他问题上找到我想要的。或者有人建议我用其他方式来展示我想要的东西吗


Tags: 路径程序目的var轨迹时间绘制直线
2条回答

下面是一个绘制多条曲线的想法,这些曲线的透明度彼此重叠:

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

multiple curves with transparency

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

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

2d histogram

还有一种方法是在置信区间之间使用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()

fill_between with confidence intervals

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

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

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

相关问题 更多 >

    热门问题