我有一个pandas DataFrame,包含100个给定进程的实现,在10个不同的日期观察到(所有实现都从0日的同一点开始)。 可以使用以下命令生成这样的DataFrame:
import pandas as pd
import numpy as np
nbDates = 10
nbPaths = 100
rnd = np.random.normal(loc=0, scale=1, size=nbPaths*nbDates).reshape(nbDates,nbPaths)
sim = dict()
sim[0] = [100.0] * nbPaths
for t in range(nbDates):
sim[t+1] = sim[t] + rnd[t]
sim = pd.DataFrame(sim)
现在我知道我可以像这样绘制DataFrame中包含的100条路径
sim.T.plot(legend=False)
并获得如下图表:
但我真正想做的是在每个日期绘制我的过程的最小值和最大值,并使用颜色贴图为两个极值之间的区域着色,该颜色贴图将反映绘图中路径的浓度(因此对于当我们走向极端时,实例会在平均值附近变红并且逐渐变冷。
我已经看过使用色图来实现这一点,但我还没有管理它。如果有人知道一种直截了当的方式,那将非常有帮助。
谢谢!
答案 0 :(得分:1)
你可以通过首先制作你的"浓度"的等高线图来做到这一点(尽管可能不是最优雅的方式)。使用contourf
,然后制作最大值和最大值的线图min,最后使用fill_between
方法来掩盖轮廓图中不需要的部分。然而,这样做的正确方法是在等高线图中掩盖阵列,但我现在还没有时间去弄清楚(看看numpy mask array options然后捅它)。您希望屏蔽数组以仅显示最大值和最小值。
以下是使用fill_between
而不是屏蔽数组的示例:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
## Your simulation code here ##
# Extract max, min, and mean values for each x coordinate
minimums = np.array(sim.min())
maximums = np.array(sim.max())
means = np.array(sim.mean())
x = np.array(sim.min().index)
y = np.arange(90,111)
X, Y = np.meshgrid(x, y)
# Insert your calculation for "concentration" in the line below
Z = (maximums[X] - minimums[X]) * Y // 100
# set up axes with matplotlib
fig, ax = plt.subplots()
# Plot contour, you'll want to change the levels
# depending on the range of values in your "concentration"
ax.contourf(X, Y, Z, levels=np.arange(0,20,.1), cmap=plt.get_cmap('jet'))
# Plot min, max, and mean
ax.plot(x, minimums, c='k')
ax.plot(x, maximums, c='k')
ax.plot(x, means, c='k', lw=2)
# Fill space outside min and max with white
ax.fill_between(x, maximums, 110, color='w')
ax.fill_between(x, 90, minimums, color='w')
这应该产生以下输出:
您可以选择自己的功能来计算"浓度"获得你想要的那种填充模式。上面代码中的一个用于显示如何使它依赖于图中的X和Y位置。祝你好运!