2012-11-28 10 views
15

I-Daten auf einer Karte am Plotten mit diesem Code:beseitigen weißen Ränder in Matplotlib/Basemap pcolor Grundstück

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) 

Der in diesem Bild ergibt: enter image description here

Wie Sie sehen können, gibt es weiße Lücken zwischen den Rasterzellen. Wie kann ich sie loswerden?

+0

können Sie die Datendatei überall aufstellen? – tacaswell

+0

Leider nicht, aber es ist regelmäßig Gitterdaten. – HyperCube

+0

Für was auch immer es wert ist, kann ich nicht reproduzieren Ihr Problem mit zufällig generierten (oder konstanten) Daten ... Welche Version von Matplotlib verwenden Sie? Vielleicht ist es ein Fehler, der behoben wurde? Außerdem wird 'pcolormesh' in diesem Fall schneller sein. Versuchen Sie, es anstelle von 'pcolor' zu verwenden. Ich bezweifle (?) Es wird Ihr Problem beheben, aber es sollte schneller sein, egal. –

Antwort

2

Ich hatte das gleiche Problem einmal. Es ist sehr wahrscheinlich, dass das Problem in longitude ist. Stellen Sie sicher, dass 0 und 360 beide im Eingang vorhanden sind. Ist dies nicht der Fall, fügen Sie sie manuell hinzu, und nehmen Sie die Änderung an mydata vor, damit sie die gleiche Form haben.

+0

Ich benutze einen Bereich von -180, 180. Das sollte auch funktionieren?Tatsächlich fehlte 180, also habe ich es hinzugefügt und die letzte Spalte der Daten erneut in die Daten kopiert. Die weißen Streifen bleiben jedoch erhalten. – HyperCube

3

Ich weiß, das ist eine alte Frage, aber ich dachte, ich würde meine Lösung für dieses Problem hinzufügen. Ich fand Ihre Frage, wenn ich genau das gleiche Problem, wie bei Ihnen, dh eine weiße Linie in meinem Grundstück und von -180 bis 180. Die Lösung für mich geht Gitter war die Basemap Funktion addcyclic

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

zu verwenden Das hat mein Problem gelöst. Prost, Trond

2

Es sieht aus wie zu mir wie der ursprüngliche Beitrag fragt nicht wirklich über den weißen Bereich zwischen 0 und 360 Grad.

Ich denke, die OP über die Linien zwischen jedem Quadrat der Farbe sprechen, die mit this bug konsistent sein würden:

Es scheint, dass savig ein pcolor Grundstück zu einem PDF-Format immer Rasterlinien enthält, was nicht ist gilt für andere Ausgabeformate wie

Hier png ist, was die Entwickler über das Problem sagen:

ich sehe in den Gitternetzlinien resultierendes Bild in gs, xpdf Preview.app aber nicht in Adobe Reader. Wenn ich in die Vorschau zoome, springen die Zeilen ein wenig, und haben immer die gleiche Breite auf dem Bildschirm unabhängig von der Zoomstufe.

In diesem Beispiel werden viele Polygone gezeichnet, so dass angrenzende Polygone eine Kante mit den exakt gleichen Koordinaten teilen. Der Code füllt das Innere jedes Polygons mit , und anscheinend geben einige Rendering-Algorithmen eine Linie mit minimaler Breite zwischen Polygonen zurück.

So ist es ein Problem mit dem PDF-Viewer, nicht mit pcolor oder einem anderen Aspekte matplotlib.