Python 实时变化热图绘制

4 投票
2 回答
11093 浏览
提问于 2025-04-18 17:48

我有一个50乘50的二维网格。每个位置都有一个强度值,也就是说数据的格式是(x,y,intensity),适用于这50乘50的每个位置。我想把这些数据可视化成热力图。

问题是,每秒钟强度值会变化(大部分位置都是这样),这意味着我需要每秒重新绘制一次热力图。我在想,处理这种实时变化的热力图,最好的库或者方法是什么呢?

2 个回答

2

谢谢你的回答,这确实帮到了我。我想补充一下,如果你想让这个在图形中正确地更新和显示,你需要在最后加上一行:

fig.canvas.flush_events()

对于使用Jupyter的人来说,如果你想让图形在新窗口中打开,可以在你的代码单元的开头加上:

%matplotlib qt
7

这其实要看你是怎么获取数据的,不过:

import matplotlib.pyplot as plt
import numpy as np
import time

# create the figure
fig = plt.figure()
ax = fig.add_subplot(111)
im = ax.imshow(np.random.random((50,50)))
plt.show(block=False)

# draw some data in loop
for i in range(10):
    # wait for a second
    time.sleep(1)
    # replace the image contents
    im.set_array(np.random.random((50,50)))
    # redraw the figure
    fig.canvas.draw()

这段代码会每隔1秒随机显示11张50x50像素的图片。关键的部分是 im.set_array,它用新的图片数据替换掉旧的图片,而 fig.canvas.draw 则是把图片重新绘制到画布上。


如果你的数据实际上是以 (x, y, intensity) 这种形式存在的一组点,你可以把它们转换成 numpy.array

import numpy as np

# create an empty array (NaNs will be drawn transparent)
data = np.empty((50,50))
data[:,:] = np.nan

# ptlist is a list of (x, y, intensity) triplets
ptlist = np.array(ptlist)
data[ptlist[:,1].astype('int'), ptlist[:,0].astype('int')] = ptlist[:,2]

撰写回答