2015-02-26 5 views
2

Я хочу нарисовать блоки цвета на полярной сетке. В настоящее время (как показано ниже) блоки не соответствуют указанным меридианам и параллелям. Я бы хотел, чтобы эти блоки соответствовали арочным ящикам, которые я нарисовал. Любая помощь была бы чрезвычайно оценена.Python: Блокировка блоков на полярной сетке (Basemap.pcolormesh)

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

fig = plt.figure() 

cols = np.linspace(60,200,4) 
rows = np.linspace(60,78,4) 

ax = fig.add_subplot(1,1,1) 
Z = np.random.random((4,4)) 

m = Basemap(width=6500000, height=3000000, 
     resolution='l', projection='stere',\ 
     lat_0=72, lon_0=130.) 

### draw parallels and meridians. 
m.drawparallels(rows, linewidth=0.7) 
m.drawmeridians(cols, linewidth=0.7) 
m.drawmapboundary() 

x, y = m(*np.meshgrid(cols,rows)) 
m.pcolormesh(x, y, Z, vmin=0, vmax=1) 

plt.tight_layout() 
plt.savefig('sof_example.png') 

ответ

0

Я думаю, что нет простого способа сделать это. То, как я это вижу, питон не «знает» о проекции карты. То, что вы делаете, не lon/lat, а скорее lon/lat, который был преобразован в координаты осей по базовой карте. Так что вы можете сделать именно то, что вы сделали, но уточнить сетку графика.

Это, кажется, сделать трюк, но это своего рода «грубой» решение ;-)

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

fig = plt.figure() 

cols = np.linspace(60,200,4) 
rows = np.linspace(60,78,4) 

ax = fig.add_subplot(1,1,1) 
Z = np.random.random((4,4)) 

m = Basemap(width=6500000, height=3000000, 
     resolution='l', projection='stere',\ 
     lat_0=72, lon_0=130.,ax=ax) 

### draw parallels and meridians. 
m.drawparallels(rows, linewidth=0.7) 
m.drawmeridians(cols, linewidth=0.7) 
m.drawmapboundary() 

### set up new cols, rows and z that are on high-res grid 
cols2 = np.linspace(cols[0],cols[-1],100) 
rows2 = np.linspace(rows[0],rows[-1],100) 
Z2 = np.zeros((100,100)) 

for i in range(0,cols.shape[0]-1): 
    for j in range(0,rows.shape[0]-1): 
     ### find corresponding cols, rows on high-res grid 
     i0 = np.where(np.abs(cols2-cols[i]) == np.min(np.abs(cols2-cols[i])))[0] 
     i1 = np.where(np.abs(cols2-cols[i+1]) == np.min(np.abs(cols2-cols[i+1])))[0] 
     j0 = np.where(np.abs(rows2-rows[j]) == np.min(np.abs(rows2-rows[j])))[0] 
     j1 = np.where(np.abs(rows2-rows[j+1]) == np.min(np.abs(rows2-rows[j+1])))[0] 
     ### put Z value in new Z2 array 
     Z2[j0:j1+1,i0:i1+1] = Z[j,i] 

x,y = m(*np.meshgrid(cols2,rows2)) 
m.pcolormesh(x,y,Z2,vmin=0,vmax=1) 

plt.tight_layout() 
plt.savefig('sof_example.png') 

plt.show()