2016-05-23 3 views
1

J'essaie d'avoir trois sous-trames pseudocolor côte à côte, avec une barre de couleurs pour les sous-placettes # 1 et # 2 et une deuxième barre de couleurs pour # 3. J'aimerais aussi que les limites de couleur (clim) soient définies de la même manière pour les deux premières (donc la première barre de couleurs refléterait les valeurs des deux sous-placettes # 1 et # 2).Comment ajouter une barre de couleurs commune aux sous-trames dans Matplotlib et modifier leurs limites ensemble

Voici ce que j'ai jusqu'à présent:

import numpy as np 
import matplotlib.pyplot as plt 
plt.ion() 
import matplotlib as mpl 


data1 = np.random.random((10,10)) 
data2 = 2.*np.random.random((10,10)) 
data3 = 3.*np.random.random((10,10)) 


f, (ax1, ax2, ax3) = plt.subplots(1, 3, sharey=True) 

imgplot1 = ax1.pcolormesh(data1, edgecolors='None') 

imgplot2 = ax2.pcolormesh(data2, edgecolors='None') 

plt.subplots_adjust(hspace=0.1, wspace=0.1) 
cax2, kw = mpl.colorbar.make_axes([ax1, ax2]) 
plt.colorbar(imgplot2, cax=cax2, **kw) 
imgplot2.set_clim(0,20) 

imgplot3 = ax3.pcolormesh(data3, edgecolors='None') 
cax3, kw = mpl.colorbar.make_axes([ax3]) 
plt.colorbar(imgplot3, cax=cax3, **kw) 

imgplot2.set_clim(0,20) ensembles intrigue secondaire # 2 (bien que je l'ai vu une question dépendant du backend où il ne met pas à jour toujours à moins que vous interagissez avec l'intrigue), mais est Y at-il un moyen de lier les limites de couleur de deux sous-tracés de sorte qu'une barre de couleurs puisse décrire les deux tracés? Mise à jour: Pour clarifier, je suis à la recherche de la possibilité de réajuster clim après que les parcelles ont déjà été créées.

Répondre

0

Spécifiez vmin et vmax dans vos deux appels à pcolormesh des axes où les données doivent être visualisées avec une barre de couleurs commune.

Dans votre cas:

opts = {'vmin': 0, 'vmax': 20, 'edgecolors': 'none'} 
imgplot1 = ax1.pcolormesh(data1, **opts) 
imgplot2 = ax2.pcolormesh(data2, **opts) 

Et puis se débarrasser de l'appel à imgplot2.set_clim(0,20). Vous pouvez également appeler le set_clim sur imgplot1 en utilisant les mêmes paramètres. Cela aurait le même effet.

En continuant sur votre commentaire ci-dessous cette réponse, vous pouvez aussi remplacer facilement votre seul appel à imgplot2.set_clim avec un appel à une fonction personnalisée qui met à jour la clim des deux axes:

def update_clims(vmin, vmax, axes): 
    for ax in axes: 
     ax.set_clim(vmin, vmax) 

Si vous voulez vraiment , vous pouvez relier la méthode set_clim de la classe Axes pour exécuter la fonctionnalité ci-dessus, à condition d'ajouter une liste d'axes ayant partagé des données z. Mais cela semble beaucoup de travail pour une fonction autrement facile à mettre en œuvre. Et puisque vous appelez une mise à jour du clim déjà une fois sur un axes, vous pouvez tout aussi facilement le remplacer par cet appel.

+0

Vous décrivez comment définir chaque limite de la barre de couleurs indépendamment. Je me demande s'il existe un moyen de lier les deux limites de couleurs pour les deux graphiques, ou si vous devez ajuster manuellement les limites de couleur pour les deux à chaque fois que vous en changez une. – user1704042

+0

@ user1704042 une sorte d'option 'sharez' similaire à' sharex', vous voulez dire? Je n'ai pas compris cela de votre question. À ma connaissance, cela n'existe pas (encore). Écrire un gestionnaire d'événement pour mettre à jour le 'clim' des axes partagés serait une approche, mais pourquoi ne pas simplement remplacer votre appel unique' imgplot2.set_clim' par un appel à une fonction qui fait la même chose? Le résultat final est le même, peu importe s'il est implémenté dans la fonctionnalité mpl de base ou dans le code d'utilisateur final. J'espère que cela aide, les gens oublient souvent les solutions faciles à un problème. –