首页 文章

底图和轮廓,Python

提问于
浏览
0

我有一组卫星数据file here,我为lat&lon创建了一个网格,为臭氧值创建了一个2D数组 .

我知道为了在 Map 中绘制数据的contourf,我需要投影坐标,但我无法找到绕过它的方法,因为我的网格不是正方形(144x24) . 我覆盖了地理区域(0到360; -30到30),我需要方形像素 .

发布它的数据很长,但到目前为止这是我的代码,

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from mpl_toolkits.basemap import Basemap, cm
%matplotlib inline

path = '/home/rafaella/month_files_CSV/O3_COLUMNS_MATCHED_fv0005_200306.csv'
df = pd.read_csv(path, skiprows=1)

df = pd.read_csv(path, delim_whitespace=True)
lat = np.array(df['AVG_LAT'])
lon = np.array(df['AVG_LON'])
toc = np.array(df['TROP_COL'])

#new grid for lon[0,360] lat[-30,30]

lomin = 0
lomax = 360
lamin = -30
lamax = 30
stp   = 2.5

loc_lon = np.zeros(int((lomax-lomin)/stp))
loc_lat = np.zeros(int((lamax-lamin)/stp))

for i in range(0,len(loc_lon)):
    loc_lon[i] = i*stp +lomin

for j in range(0,len(loc_lat)):
    loc_lat[j] = j*stp +lamin

mtoc_local = np.zeros((len(loc_lon),len(loc_lat))) 
sdtoc_local = np.zeros((len(loc_lon),len(loc_lat))) 
mtoc_local[:,:] = np.nan      
sdtoc_local[:,:] = np.nan

for i in range (0, len(loc_lon)):
    for j in range (0,len(loc_lat)):
        ix = np.where((lon>=loc_lon[i])& (lat>=loc_lat[j]) & (lon<loc_lon[i]+stp) & (lat<loc_lat[j]+stp))[0] 
        mtoc_local[i,j]=np.nanmean(toc[ix]) 
        sdtoc_local[i,j]=np.nanstd(toc[ix])

fig = plt.figure(figsize=(20, 5))
map = Basemap(llcrnrlon=0,llcrnrlat=-30, urcrnrlon=360.,urcrnrlat=30.,\
        rsphere=(6378137.00,6356752.3142),\
        resolution='l',projection='merc',\
        lat_0=0,lon_0=-30.,lat_ts=30.)

map.drawcoastlines()
# draw parallels
map.drawparallels(np.arange(-30,30,10),labels=[1,1,0,1])
# draw meridians
map.drawmeridians(np.arange(-180,180,20),labels=[1,1,0,1])

map = plt.contourf(loc_lon, loc_lat , mtoc_local.T, vmin=210, vmax=350,  cmap='RdPu')
plt.colorbar(orientation='horizontal', ticks=[200, 220, 240, 260, 280, 300, 320, 340] )
plt.title('Tropical TOC monthly mean 06,2009')

plt.show()

它很好地绘制了 Map 或数据,但不是两者 . 这里两个图像分开map

real data

我是python的新手,我一个月前开始,所以我仍然不熟悉所有函数和库 .

1 回答

  • 1

    您的代码有两个问题 . 首先,您必须在坐标上应用投影,这是使用 x,y = map(lon, lat) 完成的 . 但是,由于loc_lon和loc_lat的维度不同,这会在您的情况下引发错误 . 您可以传递与z(mtoc_local.T)具有相同形状的数组,而不是将x和y向量传递给contourf函数 . 您可以使用 np.meshgrid 来创建它们 . 简而言之,使用以下三行替换带有contourf命令的行

    X, Y = np.meshgrid(loc_lon, loc_lat)
    x,y = map(X,Y)
    map = plt.contourf(x, y , mtoc_local.T, vmin=210, vmax=350,  cmap='RdPu')
    

    结果看起来像这样
    enter image description here

相关问题