如何用matplotlib.imshow绘制40×40三维数据集热力图并解决内存溢出
解决热力图绘制内存溢出问题的方案
你的问题核心是错误地用原始数据的1600个点生成了1600×1600的插值网格,导致内存占用过高。以下是针对性的解决方法:
方案一:直接利用原始规整网格绘制(最优)
因为你的数据集本身就是40×40的规整点,不需要额外插值,直接将一维数据重塑为二维数组后绘制即可:
import numpy as np import matplotlib.pyplot as plt # 假设x、y、z是存储对应分量的一维数组(各1600个元素) x_2d = x.reshape(40, 40) y_2d = y.reshape(40, 40) z_2d = z.reshape(40, 40) # 绘制热力图 plt.imshow(z_2d, extent=[x.min(), x.max(), y.min(), y.max()], origin='lower', aspect='auto', cmap='viridis') plt.colorbar(label='Max Source Temperature') plt.xlabel('Reflectivity') plt.ylabel('Emissivity') plt.title('Max Source Temperature Heatmap') plt.show()
方案二:按需设置插值网格分辨率(如需平滑效果)
如果需要更平滑的热力图,不要用1600×1600的网格,自定义合理的分辨率(比如100×100)即可:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import Rbf # 定义插值后的网格大小,按需调整(示例为100×100) xi = np.linspace(x.min(), x.max(), 100) yi = np.linspace(y.min(), y.max(), 100) xi_grid, yi_grid = np.meshgrid(xi, yi) # 创建Rbf插值器并计算插值结果 rbf = Rbf(x, y, z, function='linear') zi_grid = rbf(xi_grid, yi_grid) # 绘制热力图 plt.imshow(zi_grid, extent=[x.min(), x.max(), y.min(), y.max()], origin='lower', aspect='auto', cmap='viridis') plt.colorbar(label='Max Source Temperature') plt.xlabel('Reflectivity') plt.ylabel('Emissivity') plt.title('Interpolated Max Source Temperature Heatmap') plt.show()
方案三:修正原始Rbf调用的网格生成逻辑
如果坚持要用Rbf但不想改变分辨率,需提取X、Y的唯一值来生成匹配原始数据的40×40网格:
import numpy as np from scipy.interpolate import Rbf # 提取X和Y的唯一值(40×40网格对应各40个唯一值) x_unique = np.unique(x) y_unique = np.unique(y) xi_grid, yi_grid = np.meshgrid(x_unique, y_unique) # 插值计算 rbf = Rbf(x, y, z, function='linear') zi_grid = rbf(xi_grid, yi_grid)
内容的提问来源于stack exchange,提问作者tjsmert44
相关产品推荐
相关产品推荐

