基于Pandas分组求和并绘制含NaN的等高线图技术咨询
解决方案
1. 计算每个坐标点的N值之和
首先通过pandas的分组聚合功能,按Lon和Lat对数据分组后求和:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'Lon': [2,2,2,2,3,3], 'Lat': [1,2,3,2,2,2], 'N': [1,2,1,1,1,1] }) # 按坐标分组求和 sum_df = df.groupby(['Lon', 'Lat'], as_index=False)['N'].sum() print(sum_df)
运行输出结果:
Lon Lat N 0 2 1 1 1 2 2 3 2 2 3 1 3 3 2 2
2. 生成网格数据并绘制等高线
先生成指定网格的所有坐标,合并已有数据并填充缺失值,最后转换为矩阵格式绘制等高线:
import numpy as np import matplotlib.pyplot as plt # 定义网格范围 Lon_grid = np.arange(1,5) Lat_grid = np.arange(1,4) # 生成所有网格坐标的笛卡尔积 lon_mesh, lat_mesh = np.meshgrid(Lon_grid, Lat_grid) grid_df = pd.DataFrame({ 'Lon': lon_mesh.flatten(), 'Lat': lat_mesh.flatten() }) # 合并数据,缺失位置填充0(也可替换为np.nan) full_grid_df = pd.merge(grid_df, sum_df, on=['Lon', 'Lat'], how='left').fillna(0) full_grid_df['N'] = full_grid_df['N'].astype(int) print(full_grid_df) # 将数据转换为网格矩阵(适配绘图要求) n_matrix = full_grid_df['N'].values.reshape(len(Lat_grid), len(Lon_grid)) # 绘制等高线图 plt.contourf(Lon_grid, Lat_grid, n_matrix, cmap='viridis') plt.colorbar(label='N值') plt.xlabel('经度(Lon)') plt.ylabel('纬度(Lat)') plt.title('坐标点N值等高线图') plt.show()
运行输出的全网格数据:
Lon Lat N 0 1 1 0 1 2 1 1 2 3 1 0 3 4 1 0 4 1 2 0 5 2 2 3 6 3 2 2 7 4 2 0 8 1 3 0 9 2 3 1 10 3 3 0 11 4 3 0
内容的提问来源于stack exchange,提问作者Feng Hu
相关产品推荐
相关产品推荐

