2012-11-28 11 views
15

sto tramando i dati su una mappa utilizzando questo codice:Eliminare bordi bianchi nella trama pcolor/Basemap Matplotlib

import numpy as np 
import matplotlib as mpl 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from mpl_toolkits.basemap import Basemap 
from matplotlib.patches import Polygon 
from scipy.io import netcdf 

ncfile = netcdf.netcdf_file(myfile.nc,'r') 
lon = ncfile.variables['longitude'][:] 
lat = ncfile.variables['latitude'][:] 
data = ncfile.variables['mydata'][:] 
ncfile.close() 

m = Basemap(projection='nplaea', boundinglat=40, lon_0=270) 
m.drawcoastlines(linewidth=.6, zorder=2) 
m.drawparallels(np.arange(-80.,81.,20.), zorder=1) 
m.drawmeridians(np.arange(-180.,181.,20.), zorder=1) 
cNorm = mpl.colors.Normalize(vmin=0, vmax=np.nanmax(data)) 
cmap = plt.get_cmap('jet') 
lons, lats = np.meshgrid(lon, lat) 
x, y = m(lons, lats) 
datamap = m.pcolor(x, y, data, zorder=0) 
datamap.set_norm(cNorm) 
plt.colorbar(datamap, cmap=cmap, norm=cNorm, shrink=0.5) 
plt.savefig('figures/map_polar.png', dpi=150, bbox_inches='tight', pad_inches=0.4) 

Questo si traduce in questa immagine: enter image description here

Come si può vedere, ci sono gli spazi bianchi tra le celle della griglia. Come posso liberarmi di loro?

+0

puoi inserire il file di dati ovunque? – tacaswell

+0

Sfortunatamente, no, ma sono dati grigliati regolarmente distanziati. – HyperCube

+0

Per qualsiasi valore, non riesco a riprodurre il problema usando dati generati casualmente (o costanti) ... Che versione di matplotlib stai usando? Forse è un bug che è stato corretto? Inoltre, 'pcolormesh' sarà più veloce in questo caso. Prova a usarlo invece di 'pcolor'. Dubito (?) Risolverà il tuo problema, ma dovrebbe essere più veloce, a prescindere. –

risposta

2

Ho avuto lo stesso problema una volta. È molto probabile che il problema sia in longitude. Assicurarsi che nell'input siano presenti 0 e 360. In caso contrario, aggiungerli manualmente e apportare modifiche allo mydata di conseguenza in modo che abbiano la stessa forma.

+0

Sto usando un intervallo di -180, 180. Dovrebbe funzionare anche questo?In effetti mancava 180, quindi l'ho aggiunto e ho copiato nuovamente l'ultima colonna dei dati. Tuttavia, le strisce bianche rimangono ancora. – HyperCube

3

So che questa è una domanda vecchia ma ho pensato di aggiungere la mia soluzione a questo problema. Ho trovato la tua domanda quando ho avuto lo stesso problema come la tua, vale a dire una linea bianca nella mia trama e una griglia che va da -180 a 180. La soluzione per me è stato quello di utilizzare la funzione di mappa di base addcyclic

from mpl_toolkits.basemap import Basemap, shiftgrid, addcyclic 
SSTcyclic, lonCMIP5cyclic = addcyclic(SST, lonCMIP5) 

Questo ha risolto il mio problema. Cheers, Trond

2

Mi sembra che il post originale non stia effettivamente chiedendo l'area bianca tra 0 e 360 gradi.

penso che il PO sta parlando le linee tra ogni quadrato di colore che sarebbe coerente con this bug:

Sembra che savig un complotto pcolor in un formato pdf include sempre la griglia, che non è vero per altri formati di output come png

Ecco ciò che gli sviluppatori dicono in merito al problema:

vedo griglia in un immagine risultante in gs, xpdf Preview.app ma non in Adobe Reader. Quando eseguo lo zoom in Anteprima, le linee saltano un po ', e hanno sempre la stessa larghezza sullo schermo indipendentemente dal livello di zoom.

Ciò che viene visualizzato in questo esempio è un sacco di poligoni, in modo che i poligoni adiacenti condividano un bordo con le stesse identiche coordinate. Il codice riempie lo all'interno di ciascun poligono e apparentemente alcuni algoritmi di rendering lasciano una linea di minima larghezza tra i poligoni.

Quindi è un problema con il visualizzatore di PDF, non con pcolor o qualsiasi altro aspetto di matplotlib.

Problemi correlati