【发布时间】:2017-12-05 09:20:01
【问题描述】:
我有一组卫星数据file here,我为纬度和经度创建了一个网格,为臭氧值创建了一个二维数组。
我知道为了在地图中绘制数据的轮廓,我需要投影坐标,但由于我的网格不是正方形 (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
我是python的新手,一个月前开始的,所以对所有的函数和库我还是不熟悉。
【问题讨论】:
-
您能否发布一个您的 csv 文件或 lat/lon/toc 变量的示例?如果没有recreates the problem 的一些示例数据,我们很难提供帮助。
-
当然可以,但是问题出在投影坐标上,我使用的不是数据中给出的坐标,而是一个网格。
-
我认为 Basemap 不喜欢 [0,360] 范围内的经度,而是 [-180, 180] 范围内的经度。不确定这是否是您的问题的根本原因。
-
您的数据链接似乎无效。
-
我更改了链接,我希望这有效
标签: python matplotlib-basemap contourf