2016-10-18 1 views
3

Le problèmeColorbar/problème de traçage? « Posx et posy doivent être des valeurs finies »

J'ai un tableau avec latitude-longitude 6 couches (array.size = (192,288,6)) contenant un tas de données allant des valeurs de près 0 à environ 0.65. Quand je trace des données de chacune des couches 6 ([:,:,0], [:,:,1], etc.), je n'ai pas de problème et j'obtiens une belle carte, sauf [:,:,4]. Pour une raison quelconque, lorsque j'essaie de tracer ce tableau 2D, je reçois un message d'erreur que je ne comprends pas, et il ne s'affiche que lorsque j'essaie d'inclure une barre de couleurs. Si je Nix le colorbar il n'y a pas d'erreur, mais je dois ... que colorbar

Le code

Voici le code que j'utilise pour une autre partie du tableau, ainsi que le tracé résultant. Allons-y avec [:,:,5].

#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

Maintenant, quand j'utiliser le même code EXACT mais parcelle pour array[:,:,4] au lieu de array[:,:,5], je reçois cette erreur.

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 

Je ne sais pas pourquoi il fait cela comme mon code pour toutes les autres parties des parcelles de tableau très bien, et ils utilisent tous le même meshgrid. Il n'y a aucun NaN dans le tableau. Aussi est ici le résultat si je commente tout le code entre #Colorbar et #Titles & labels

enter image description here

MISE À JOUR: Le problème disparaît également quand j'inclure le code colorbar mais changé le PowerNorm-1.0 (norm = colors.PowerNorm(1.0,vmax=0.65)). Toute autre chose que 1.0 génère l'erreur lorsque la barre de couleurs est incluse.

La question

Ce qui pourrait être à l'origine du posx & posy message d'erreur, et comment puis-je me débarrasser je peux faire ce complot avec le colorbar inclus?

MISE À JOUR

Quand je lance le noyau à partir de zéro, encore une fois avec le même code (sauf que je changé le 0.6 lié à 0.65), je reçois les avertissements suivants dans le bloc array[:,:,4]. Je ne suis pas sûr s'ils sont liés, mais je les inclurai juste au cas où.

/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

Malheureusement sans tableau lui-même, nous ne pouvons pas vraiment debug. Que montre 'np.isfinite (array [:,:, 4])'? Pouvez-vous examiner les min et max de 'array [:,:, 4]'? c'est-à-dire que vos 'boundlabels' se trouvent réellement dans les données pour cette tranche? Etc. etc. – Ajean

+0

"print np.where (np.isfinite (lintrends [:,:, 4]) == False)" ne renvoie aucun emplacement de tableau, donc toutes les données sont finies. np.max = 0,613478607374 et np.min = 4,4408920985e-15, donc toutes les données sont comprises entre 0 et 0,65. (J'ai changé 0,6 dans les limites à 0,65 et toujours obtenir la même erreur.) – ChristineB

Répondre

2

Je trouve que la spécification vmax & vmin résout le problème. Je ne sais pas pourquoi, mais une fois que je l'ai fait, mon intrigue s'est déroulée correctement avec la barre de couleurs.

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

enter image description here

+0

Remarqué cela aussi; vos mises à jour étaient intéressantes. Malheureusement, il existe [des situations où la spécification des niveaux est absolument nécessaire pour le comportement souhaité] (https://stackoverflow.com/questions/42723538/setting-matplotlib-colorbar-range-larger-range-than-the-values-placed). Essayant de trouver une solution de contournement, mais jusqu'ici sont venus au sec. Juste incroyablement frustrant. –