2016-09-27 1 views
2

Je dois partager la même barre de couleurs pour une rangée de sous-placettes. Chaque sous-schéma a une mise à l'échelle logarithmique symétrique de la fonction de couleur. Chacune de ces tâches a une bonne solution expliquée ici sur stackoverflow: For sharing the color bar et for nicely formatted symmetric logarithmic scaling.Une barre de couleurs pour plusieurs sous-placages en mise à l'échelle logarithmique symétrique

Cependant, lorsque je combine les deux astuces dans le même code, la barre de couleurs "oublie" est censée être logarithmique symétrique. Y a-t-il un moyen de contourner ce problème?

test du code est le suivant, pour lequel je combiné les deux références ci-dessus de manière évidente:

import numpy as np                     
import matplotlib.pyplot as plt                  
from mpl_toolkits.axes_grid1 import ImageGrid              
from matplotlib import colors, ticker                

# Set up figure and image grid                  
fig = plt.figure(figsize=(9.75, 3))                 

grid = ImageGrid(fig, 111,   # as in plt.subplot(111)           
       nrows_ncols=(1,3),                 
       axes_pad=0.15,                  
       share_all=True,                  
       cbar_location="right",                
       cbar_mode="single",                 
       cbar_size="7%",                  
       cbar_pad=0.15,                  
       )                     

data = np.random.normal(size=(3,10,10))                
vmax = np.amax(np.abs(data))                   

logthresh=4                       
logstep=1                       
linscale=1                       

maxlog=int(np.ceil(np.log10(vmax)))                 

#generate logarithmic ticks                   
tick_locations=([-(10**x) for x in xrange(-logthresh, maxlog+1, logstep)][::-1]      
       +[0.0]                    
       +[(10**x) for x in xrange(-logthresh,maxlog+1, logstep)])       

# Add data to image grid                    
for ax, z in zip(grid,data):                   
    print z                       
    im = ax.imshow(z, vmin=-vmax, vmax=vmax,               
        norm=colors.SymLogNorm(10**-logthresh, linscale=linscale))      

# Colorbar                       
ax.cax.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter())        
ax.cax.toggle_label(True)                   

#plt.tight_layout() # Works, but may still require rect paramater to keep colorbar labels visible 
plt.show() 

La sortie générée est la suivante: enter image description here

Répondre

0

Est-ce que vous essayez d'atteindre ?

import numpy as np                     
import matplotlib.pyplot as plt                  
from mpl_toolkits.axes_grid1 import ImageGrid              
from matplotlib import colors, ticker                

# Set up figure and image grid                  
fig = plt.figure(figsize=(9.75, 3))                 

grid = ImageGrid(fig, 111,   # as in plt.subplot(111)           
       nrows_ncols=(1,3),                 
       axes_pad=0.15,                  
       share_all=True                                   
       )                     

data = np.random.normal(size=(3,10,10))                
vmax = np.amax(np.abs(data))                   

logthresh=4                       
logstep=1                       
linscale=1                       

maxlog=int(np.ceil(np.log10(vmax)))                 

#generate logarithmic ticks                   
tick_locations=([-(10**x) for x in xrange(-logthresh, maxlog+1, logstep)][::-1]      
       +[0.0]                    
       +[(10**x) for x in xrange(-logthresh,maxlog+1, logstep)])       


# Add data to image grid                    
for ax, z in zip(grid,data):                   
    print z                       
    im = ax.imshow(z, vmin=-vmax, vmax=vmax,               
        norm=colors.SymLogNorm(10**-logthresh, linscale=linscale)) 

cbaxes = fig.add_axes([0.9, 0.125, 0.02, 0.77])      
fig.colorbar(im, format=ticker.LogFormatter(), ticks=tick_locations, cax = cbaxes) 
ax.cax.toggle_label(True) 


#plt.tight_layout() # Works, but may still require rect paramater to keep colorbar labels visible 
plt.show() 

Sortie: enter image description here

+0

Oui, c'est exactement ce que j'essayais de réaliser, merci! En fonction de votre réponse, j'ai réussi à modifier mon code d'exemple original afin qu'il fonctionne sans avoir besoin de régler les dimensions des axes comme dans votre solution. Je publierai ceci comme une réponse séparée car je pense que ce serait la méthode préférée pour le faire. – mjo

0

Sur la base de la solution par Erba Aitbayev, je trouve qu'il suffit de remplacer la ligne

ax.cax.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter()) 

dans le code exemple initialement affiché par la ligne

fig.colorbar(im,ticks=tick_locations, format=ticker.LogFormatter(), cax = ax.cax) 

et tout fonctionne sans avoir besoin de spécifier des dimensions explicites pour la barre de couleurs. Je ne sais pas pourquoi on travaille et l'autre non, cependant. Il serait bon d'ajouter un commentaire correspondant in the post on sharing colorbars. J'ai vérifié et l'échelle de couleur linéaire dans cet exemple fonctionne toujours si la barre de couleurs est appelée comme dans la deuxième des deux alternatives ci-dessus. (Je n'ai pas la réputation suffisante pour y ajouter un commentaire.)