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)
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
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 "
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
"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