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:
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