如何用Matplotlib绘制基于风场U分量的二维像素图?
问题描述
现有CSV数据包含三列:Latitude(纬度)、Longitude(经度)、U component of wind(风的U分量,单位m/s)。每组坐标对应绘图中50km×50km的像素区域,共364个数据点,矩形区域未覆盖部分留白。需要用Matplotlib绘制二维图,每个区域根据风U分量值上色(颜色从红到紫的彩虹色系,对应分量的最小值到最大值),数据从CSV读取。
最佳实现方案
方案一:规则网格数据(推荐)
如果经纬度数据是规则排列的网格(比如364=14×26的网格),使用pcolormesh可精准绘制每个50km矩形区域,空白区域自动留白:
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取CSV数据 df = pd.read_csv('你的CSV文件名.csv') # 提取并排序经纬度唯一值,构建网格 latitudes = np.sort(df['Latitude'].unique()) longitudes = np.sort(df['Longitude'].unique()) lon_grid, lat_grid = np.meshgrid(longitudes, latitudes) # 将U分量转换为网格格式(缺失数据自动填充为NaN) u_grid = df.pivot( index='Latitude', columns='Longitude', values='U component of wind' ).values # 绘制图形 plt.figure(figsize=(12, 7)) # 使用红到紫的彩虹色系(jet) im = plt.pcolormesh(lon_grid, lat_grid, u_grid, cmap='jet', shading='flat') # 添加颜色条与标签 plt.colorbar(im, label='风的U分量 (m/s)') plt.xlabel('经度') plt.ylabel('纬度') plt.title('风U分量分布') # 显示图形 plt.show()
方案二:不规则离散点
如果经纬度是不规则分布的离散点,使用scatter绘制正方形标记,调整标记大小匹配50km区域:
import pandas as pd import matplotlib.pyplot as plt # 读取CSV数据 df = pd.read_csv('你的CSV文件名.csv') # 绘制散点图 plt.figure(figsize=(12, 7)) # s参数控制标记大小,根据实际可视化需求调整 scatter = plt.scatter( x=df['Longitude'], y=df['Latitude'], c=df['U component of wind'], cmap='jet', marker='s', # 正方形标记 s=600 # 调整大小以匹配50km区域的显示比例 ) # 添加颜色条与标签 plt.colorbar(scatter, label='风的U分量 (m/s)') plt.xlabel('经度') plt.ylabel('纬度') plt.title('风U分量分布') # 显示图形 plt.show()
关键说明
- 彩虹色系使用Matplotlib内置的
jet配色,正好对应从红(最小值)到紫(最大值)的渐变。 - 方案一中,缺失数据的区域会自动显示为空白,符合需求。
- 方案二中,
s参数需要根据绘图窗口的大小和实际地理范围微调,确保正方形标记的视觉大小匹配50km的比例。
内容的提问来源于stack exchange,提问作者pwnkit
相关产品推荐
相关产品推荐

