将Pandas表格转换为矩阵生成网格:CO数据热力图绘制求助
解决方法:在Height vs Longitude网格上可视化CO浓度
别发愁,其实用Python的可视化工具就能轻松搞定你的需求!下面我给你两种实用方案,从简单到进阶,你可以根据自己的数据情况来选:
方案1:直接绘制散点图(最适合离散原始数据)
如果你的数据是零散的采样点,不需要严格的网格对齐,直接用散点图就能把每个点的CO浓度用颜色直观体现出来。用matplotlib就能实现:
import matplotlib.pyplot as plt import pandas as pd # 假设你的数据集叫df,包含'Longitude'、'height'、'CO'三列 df = pd.DataFrame({ 'Longitude': [110, 110.5, 111, 110.2, 110.8], 'height': [100, 200, 150, 250, 300], 'CO': [0.5, 0.8, 0.6, 1.2, 0.9] }) plt.figure(figsize=(10,6)) # 核心逻辑:x轴放经度,y轴放高度,颜色绑定CO值,选个顺眼的颜色映射 scatter = plt.scatter(df['Longitude'], df['height'], c=df['CO'], cmap='viridis', s=50) # 加上颜色条和标签,让图更清晰 plt.colorbar(scatter, label='Average CO Concentration') plt.xlabel('Longitude') plt.ylabel('Height') plt.title('CO Concentration Distribution (Height vs Longitude)') plt.show()
这个方法不用额外处理数据,直接用原始采样点,每个点的位置和颜色都对应真实值,非常直观。
方案2:生成网格化热力图(适合连续网格展示需求)
如果你想要类似地形图的连续网格热力图,就需要先把离散点插值成二维网格。这里会用到numpy和scipy的插值工具:
import matplotlib.pyplot as plt import pandas as pd import numpy as np from scipy.interpolate import griddata # 还是用示例数据集 df = pd.DataFrame({ 'Longitude': [110, 110.5, 111, 110.2, 110.8], 'height': [100, 200, 150, 250, 300], 'CO': [0.5, 0.8, 0.6, 1.2, 0.9] }) # 1. 先定义网格的x、y轴范围,生成均匀网格 xi = np.linspace(df['Longitude'].min(), df['Longitude'].max(), 100) yi = np.linspace(df['height'].min(), df['height'].max(), 100) xi, yi = np.meshgrid(xi, yi) # 2. 用插值方法把离散的CO值映射到网格上 # 可选插值方式:'linear'(线性)、'nearest'(最近邻)、'cubic'(三次),按需选 zi = griddata((df['Longitude'], df['height']), df['CO'], (xi, yi), method='linear') # 3. 绘制热力图 plt.figure(figsize=(10,6)) plt.pcolormesh(xi, yi, zi, cmap='viridis', shading='auto') plt.colorbar(label='Average CO Concentration') plt.xlabel('Longitude') plt.ylabel('Height') plt.title('Gridded CO Concentration (Height vs Longitude)') plt.show()
为什么你之前的方法容易出错?
你提到尝试用条件判断手动构建矩阵,其实完全没必要!上面的工具已经帮你处理了离散点到网格的转换,不需要自己写循环或条件判断填充矩阵——既容易出错又麻烦。
如果你的数据本身就是规则网格(比如每个经度和高度的组合都有对应值),那更简单,直接用pivot转成二维矩阵,再用seaborn的热力图绘制:
import seaborn as sns # 假设数据是规则网格结构 grid_df = df.pivot(index='height', columns='Longitude', values='CO') plt.figure(figsize=(10,6)) sns.heatmap(grid_df, cmap='viridis', annot=True, fmt='.1f') plt.xlabel('Longitude') plt.ylabel('Height') plt.title('CO Concentration Heatmap') plt.show()
你可以根据自己的数据类型(离散点/规则网格)选对应的方法,试试看应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

