CSV转NC后用Cartopy绘图报错温度数据为1D的解决方法
问题分析与解决方案
核心问题
- 经纬度变量混淆:代码错误地将经度赋值给
lat变量、纬度赋值给lon变量,导致坐标完全错位,插值和绘图无法匹配地图区域。 - Cartopy绘图投影未指定:使用
imshow时未声明数据的投影坐标系,导致热力图无法和Cartopy的地图框架对齐。 - 已弃用的DataFrame方法:
merged_df.append()已被Pandas弃用,建议用pd.concat()替代。 - contourf使用错误:
contourf需要二维网格数据,直接传入一维经纬度和温度数据会触发"一维数据"报错,必须先完成网格插值。
修正后的代码
import pandas as pd import os import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from scipy.interpolate import griddata # 加载参考CSV文件 reference_file_path = "C:/Users/ACER/Desktop/python prac/meghna_pcp_station.csv" reference_df = pd.read_csv(reference_file_path) # 存储合并后的数据(用列表收集再concat,替代弃用的append) merged_dfs = [] # 获取目录下所有CSV文件 directory_path = "C:/Users/ACER/Desktop/python prac" csv_files = [file for file in os.listdir(directory_path) if file.endswith(".csv")] # 遍历并合并数据 for csv_file in csv_files: file_path = os.path.join(directory_path, csv_file) NAME = os.path.splitext(csv_file)[0] data_df = pd.read_csv(file_path) data_df["NAME"] = NAME merged_data = pd.merge(data_df, reference_df, on="NAME", how="inner") merged_dfs.append(merged_data) merged_df = pd.concat(merged_dfs, ignore_index=True) # 创建绘图对象与地图投影 fig, ax = plt.subplots(figsize=(10, 10), subplot_kw={"projection": ccrs.PlateCarree()}) # 添加地图要素 ax.coastlines() ax.add_feature(cfeature.BORDERS) ax.add_feature(cfeature.LAND, facecolor="lightgray") ax.add_feature(cfeature.OCEAN, facecolor="white") # 正确提取经纬度和温度数据(修正变量混淆问题) lon = merged_df["LONGITUDE"].values lat = merged_df["LATITUDE"].values temperature = merged_df["Temperature"].values # 创建规则网格用于插值 lon_grid, lat_grid = np.meshgrid( np.linspace(lon.min(), lon.max(), 100), np.linspace(lat.min(), lat.max(), 100) ) # 插值得到二维温度网格 temperature_grid = griddata((lon, lat), temperature, (lon_grid, lat_grid), method="linear") # 绘制热力图(指定transform和extent,匹配Cartopy投影) heatmap = ax.imshow( temperature_grid, extent=[lon.min(), lon.max(), lat.min(), lat.max()], cmap="coolwarm", origin="lower", aspect="auto", transform=ccrs.PlateCarree() ) # 添加色标 cbar = plt.colorbar(heatmap, label="Temperature") # 设置标题 plt.title("Temperature Distribution") # 显示图像 plt.show()
额外说明
- 如果需要使用
contourf绘图,替换imshow部分为以下代码即可:cf = ax.contourf(lon_grid, lat_grid, temperature_grid, cmap="coolwarm", transform=ccrs.PlateCarree()) cbar = plt.colorbar(cf, label="Temperature") - 若插值后出现空白区域,可尝试将
griddata的method参数改为nearest(最近邻插值),避免线性插值产生NaN值。
内容的提问来源于stack exchange,提问作者Farhana Humyra
相关产品推荐
相关产品推荐

