You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSV转NC后用Cartopy绘图报错温度数据为1D的解决方法

问题分析与解决方案

核心问题

  1. 经纬度变量混淆:代码错误地将经度赋值给lat变量、纬度赋值给lon变量,导致坐标完全错位,插值和绘图无法匹配地图区域。
  2. Cartopy绘图投影未指定:使用imshow时未声明数据的投影坐标系,导致热力图无法和Cartopy的地图框架对齐。
  3. 已弃用的DataFrame方法:merged_df.append()已被Pandas弃用,建议用pd.concat()替代。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:35:02