如何在曲线下绘制热图?

计算科学 可视化 绘图 matplotlib
2021-12-27 06:14:05

如果我有一个随时间演变的一维系统的数据,本质上是一个二维数组,并且每个时间点的数组大小相同,我将如何产生这样的东西:

例子

(取自图灵的生物模式形成模型和Maini 等人的鲁棒性问题,2012)

我试图通过根据域的增长及时调整(或者更确切地说合成)每个实例的大小到特定长度的数组,并用 NaN 填充数组的其余部分来使用matplotlib复制这一点。

import numpy as np
import matplotlib.pyplot as plt

N = 750
x = []

t = np.linspace(0, N, N)

def asize(i, N):        # Computes the necessary size of the array
    return int(N*np.exp(2*(i-N)/N))

for i in range(N):      # Concatenating data with whitespace 
    x.append(np.concatenate((np.sin(np.linspace(0,3*np.pi,asize(i,N)))**2,
                             np.NaN*np.zeros(N-asize(i,N)))))


x = np.transpose(np.array(x))
plt.imshow(x, cmap = 'Spectral_r', origin = 'lower')
plt.plot(t, N*np.exp(2*(t-N)/N), c='white', lw = 2)     # Making the boundary smoother
plt.axis([0,N,0,N])
plt.xlabel('$t$')
plt.ylabel('$x$')
plt.xticks([0,250,500,750])
plt.yticks([0,250,500,750])
plt.show()

试图

自然,对于实际数据,这种方法会更加乏味,需要以某种方式压缩数组。使用 matplotlib、Mathematica 或任何其他工具是否有更合理的方法?

1个回答

在 StackOverflow 中回答了类似的问题。

主要的“技巧”是在绘图之前转换您的网格。例如,使用以下转换

t=t,x=xet,

然后使用(t,x)为您的情节contourf()pcolormesh()

以下是显示主要思想的片段。

import numpy as np
import matplotlib.pyplot as plt

t, x = np.pi*np.mgrid[0:1:100j, 0:1:100j]
val = x
new_x = x*np.exp(t)

# plt.contourf(t, new_x, val)
plt.pcolormesh(t, new_x, val)
plt.xlabel("t")
plt.ylabel("x")
plt.show()

这就是结果。

在此处输入图像描述