2016-10-18 4 views
3

Das ProblemColorbar/Plot Problem?

"posx und sträußchen sollten finite Werte" So habe ich einen lat-lon-Array mit 6 Schichten (array.size = (192,288,6)), um eine Reihe von Daten reichen in Werten von nahezu 0 bis etwa 0.65 enthalten. Wenn ich Daten von jeder der 6 Schichten ([:,:,0], [:,:,1], usw.) plotte, habe ich keine Probleme und bekomme eine nette Karte, außer für [:,:,4]. Aus irgendeinem Grund, wenn ich versuche, dieses 2D-Array zu plotten, bekomme ich eine Fehlermeldung, die ich nicht verstehe, und es kommt nur auf, wenn ich versuche, eine Farbleiste einzufügen. Wenn ich die colorbar nichts kein Fehler, aber ich brauche das colorbar ...

Der Code

Hier ist der Code, den ich für einen anderen Teil des Arrays verwenden, zusammen mit dem resultierenden Grundstück. Lass uns gehen mit [:,:,5]. Jetzt

#Set labels 
lonlabels = ['0','45E','90E','135E','180','135W','90W','45W','0'] 
latlabels = ['90S','60S','30S','Eq.','30N','60N','90N'] 

#Set cmap properties 
bounds = np.array([0,0.001,0.01,0.05,0.1,0.2,0.3,0.4,0.5,0.6]) 
boundlabels = ['0','0.001','0.01','0.05','0.1','0.2','0.3','0.4','0.5','0.6'] 
cmap = plt.get_cmap('jet') 
norm = colors.PowerNorm(0.35,vmax=0.65) #creates logarithmic scale 

#Create basemap 
fig,ax = plt.subplots(figsize=(15.,10.)) 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') 
m.drawcoastlines(linewidth=2,color='w') 
m.drawcountries(linewidth=2,color='w') 
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3) 
m.drawmeridians(np.arange(-180.,180.,45.),linewidth=0.3) 
meshlon,meshlat = np.meshgrid(lon,lat) 
x,y = m(meshlon,meshlat) 

#Plot variables 
trend = m.pcolormesh(x,y,array[:,:,5],cmap='jet',norm=norm,shading='gouraud') 

#Set plot properties 
#Colorbar 
cbar=m.colorbar(trend, size='5%',ticks=bounds,location='bottom',pad=0.8) 
cbar.set_label(label='Here is a label',size=25) 
cbar.set_ticklabels(boundlabels) 
for t in cbar.ax.get_xticklabels(): 
    t.set_fontsize(25) 
#Titles & labels 
ax.set_title('Here is a title for [:,:,5]',fontsize=35) 
ax.set_xlabel('Longitude',fontsize=25) 
ax.set_xticks(np.arange(0,405,45)) 
ax.set_xticklabels(lonlabels,fontsize=20) 
ax.set_yticks(np.arange(-90,120,30)) 
ax.set_yticklabels(latlabels,fontsize=20) 

enter image description here

wenn ich den EXACT gleichen Code aber Grundstück für array[:,:,4] statt array[:,:,5], ich diesen Fehler.

ValueError        Traceback (most recent call last) 
/linuxapps/anaconda/lib/python2.7/site-packages/IPython/core/formatters.pyc in __call__(self, obj) 
    305     pass 
    306    else: 
--> 307     return printer(obj) 
    308    # Finally look for special method names 
    309    method = get_real_method(obj, self.print_method) 

[lots of further traceback] 

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/text.pyc in draw(self, renderer) 
    755    posy = float(textobj.convert_yunits(textobj._y)) 
    756    if not np.isfinite(posx) or not np.isfinite(posy): 
--> 757     raise ValueError("posx and posy should be finite values") 
    758    posx, posy = trans.transform_point((posx, posy)) 
    759    canvasw, canvash = renderer.get_canvas_width_height() 

ValueError: posx and posy should be finite values 

Ich habe keine Ahnung, warum es für jeden anderen Teil der Array-Plots gerade fein dies als meinen Code tut, und sie alle verwenden die gleiche meshgrid. Es gibt keine NaN im Array. Auch hier ist das Ergebnis, wenn ich den gesamten Code auszukommen zwischen #Colorbar und #Titles & labels

enter image description here

UPDATE: Das Problem verschwindet auch, wenn ich die colorbar Code enthalten, aber änderte sich die PowerNorm-1.0 (norm = colors.PowerNorm(1.0,vmax=0.65)). Alles andere als 1.0 erzeugt den Fehler, wenn die Farbleiste enthalten ist.

Die Frage

Was die posx & posy Fehlermeldung verursachen könnte, und wie kann ich es loswerden, so kann ich dieses Grundstück mit dem colorbar enthalten machen?

UPDATE

Wenn ich den Kernel von Grund laufen, wieder mit dem gleichen Code (außer, dass ich die 0.6-0.65 gebunden geändert), habe ich die folgenden Warnungen im array[:,:,4] Block erhalten. Ich bin mir nicht sicher, ob sie verwandt sind, aber ich werde sie nur für den Fall einschließen.

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/colors.py:1202: RuntimeWarning: invalid value encountered in power 
    np.power(resdat, gamma, resdat) 

[<matplotlib.text.Text at 0x2af62c8e6710>, 
<matplotlib.text.Text at 0x2af62c8ffed0>, 
<matplotlib.text.Text at 0x2af62cad8e90>, 
<matplotlib.text.Text at 0x2af62cadd3d0>, 
<matplotlib.text.Text at 0x2af62caddad0>, 
<matplotlib.text.Text at 0x2af62cae7250>, 
<matplotlib.text.Text at 0x2af62cacd050>] 

/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/axis.py:1015:  UserWarning: Unable to find pixel distance along axis for interval padding of ticks; assuming no interval padding needed. 
    warnings.warn("Unable to find pixel distance along axis " 
/linuxapps/anaconda/lib/python2.7/site-packages/matplotlib/axis.py:1025:  UserWarning: Unable to find pixel distance along axis for interval padding of ticks; assuming no interval padding needed. 
    warnings.warn("Unable to find pixel distance along axis " 
+0

Leider ohne das Array selbst können wir nicht wirklich zu debuggen. Was zeigt dir "np.isfinite (array [:,:, 4])"? Können Sie das Minimum und Maximum von 'array [:,:, 4]' untersuchen? liegen Ihre 'couldlabels' tatsächlich in den Daten für diese Scheibe? Usw. – Ajean

+0

"print np.where (n.isfinite (lintrends [:,:, 4]) == False)" gibt keine Array-Positionen zurück, sodass alle Daten endlich sind. np.max = 0.613478607374 und np.min = 4.4408920985e-15, also liegen alle Daten zwischen 0 und 0.65. (Ich habe 0.6 in den Grenzen auf 0.65 geändert und bekomme immer noch den gleichen Fehler.) – ChristineB

Antwort

2

So fand ich heraus, dass vmax & vmin löst das Problem angibt. Ich habe keine Ahnung warum, aber sobald ich das gemacht habe, ist meine Handlung mit der Farbleiste korrekt geworden.

trend = m.pcolormesh(x,y,array[:,:,5],cmap='jet',norm=norm,shading='gouraud',vmin=0.,vmax=0.6) 

enter image description here

+0

bemerkte das auch; Ihre Updates waren interessant. Leider gibt es [Situationen, in denen das Spezifizieren von Ebenen für das gewünschte Verhalten absolut notwendig ist] (https://stackoverflow.com/questions/42723538/setting-matplotlib-colorbar-range-larger-range-than-the-values-plotted). Der Versuch, einen Workaround zu finden, ist aber bis jetzt ausgetrocknet. Einfach unglaublich frustrierend. –