Matplotlib温度热力图:稀疏数据插值与圆形轮廓调整问题咨询
解决Matplotlib温度热力图的两个问题:插值补全与圆形轮廓调整
1. 用插值算法补充稀疏数据
针对稀疏的坐标温度数据,推荐使用scipy.interpolate模块的两种实用方法,适配不同数据分布场景:
方法1:径向基函数(RBF)插值
适合非规则分布的稀疏点,插值结果平滑,能较好保留全局温度趋势:
import pandas as pd import numpy as np from scipy.interpolate import Rbf import matplotlib.pyplot as plt # 读取CSV数据 df = pd.read_csv('temp_data.csv') x = df['x'].values y = df['y'].values temp = df['temperature'].values # 生成高密度规则网格 xi = np.linspace(x.min(), x.max(), 500) yi = np.linspace(y.min(), y.max(), 500) xi, yi = np.meshgrid(xi, yi) # RBF插值(可选函数:'multiquadric'/'gaussian'/'linear',按需调整平滑度) rbf_interp = Rbf(x, y, temp, function='multiquadric') zi = rbf_interp(xi, yi)
方法2:网格数据插值(griddata)
适合快速生成规则网格,支持多种插值策略:
from scipy.interpolate import griddata # 生成网格点 xi, yi = np.meshgrid(np.linspace(x.min(), x.max(), 500), np.linspace(y.min(), y.max(), 500)) # 插值:'cubic'(平滑度高)/'linear'(计算快)/'nearest'(无平滑) zi = griddata((x, y), temp, (xi, yi), method='cubic')
2. 将八角形轮廓改为圆形分布
热力图出现八角形,是因为默认正方形网格覆盖了矩形区域,只需过滤掉圆形范围外的数据即可解决:
步骤1:生成圆形掩码
先确定数据中心和半径(可手动指定或自动计算):
# 自动计算数据中心与最大内切圆半径 x_center = (x.min() + x.max()) / 2 y_center = (y.min() + y.max()) / 2 radius = min(x.max()-x_center, y.max()-y_center) # 创建掩码:True为圆形内区域,False为圆形外 mask = (xi - x_center)**2 + (yi - y_center)**2 <= radius**2 zi_masked = np.where(mask, zi, np.nan) # 圆形外设为NaN,绘图时会被自动忽略
步骤2:绘制圆形热力图
使用imshow或contourf绘图时,传入掩码后的数据,并设置轴比例一致:
plt.figure(figsize=(8,8)) # 绘制热力图,extent匹配坐标范围,origin='lower'修正坐标方向 im = plt.imshow(zi_masked, extent=[x.min(), x.max(), y.min(), y.max()], origin='lower', cmap='viridis', interpolation='bilinear') # 添加颜色条与标注 plt.colorbar(im, label='Temperature (°C)') plt.xlabel('X Coordinate') plt.ylabel('Y Coordinate') plt.title('Circular Temperature Heatmap') plt.axis('equal') # 确保X/Y轴比例一致,圆形不会变形 plt.show()
若使用contourf绘图,同样可应用掩码:
plt.figure(figsize=(8,8)) plt.contourf(xi, yi, zi_masked, levels=20, cmap='viridis') plt.colorbar(label='Temperature (°C)') plt.axis('equal') plt.show()
内容的提问来源于stack exchange,提问作者LJ GONG
相关产品推荐
相关产品推荐

