2015-12-05 2 views
4

J'essaie de combiner deux figures qui étaient séparées auparavant. On est une figure de 3 panneaux (ax1, ax2, ax3) (tous générés avec imshow), où j'utilisais une seule carte de couleurs sur le côté. Maintenant, je veux ajouter une autre figure (ax0) que je charge à partir d'un fichier png, en utilisant imread et get_sample_data (de matplotlib.cbook).Matplotlib - deux cartes de couleurs différentes avec des plages différentes

Le problème est que cette nouvelle figure prend la même palette de couleurs que celle des 3 panneaux, donnant ainsi une couleur uniforme simple dans le panneau nouvellement ajouté. Les 3 autres panneaux ont toujours la bonne couleur.

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 
import numpy as np 

g1 = gridspec.GridSpec(4, 1, height_ratios=[4,1,1,1]) 
g1.update(wspace=0.05, hspace=0.2) # set the spacing between axes. 

f, ((ax0), (ax1), (ax2), (ax3)) = plt.subplots(4, 1, sharex='col', sharey='row') 

ax0 = subplot(g1[0]) 
ax1 = subplot(g1[1]) 
ax2 = subplot(g1[2]) 
ax3 = subplot(g1[3]) 

from matplotlib.cbook import get_sample_data 
im2 = plt.imread(get_sample_data('PathToFig/Figure.png')) 
ax0.imshow(im2, vmax=1) 

ziAA = np.random.rand(4, 4, 4) 
ziAB = np.random.rand(4, 4, 4) 
ziBA = np.random.rand(4, 4, 4) 

ax1.imshow(ziAA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4]) 
ax2.imshow(ziAB,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4]) 
im = ax3.imshow(ziBA,origin="lower",vmin=0,vmax=0.03,aspect="auto",extent=[-0.15,0.15,0,4]) 

from matplotlib import ticker 
tick_locator = ticker.MaxNLocator(nbins=5) 

f.subplots_adjust(right=0.85) 

cbar_ax = f.add_axes([1.0, 0.15, 0.01, 0.7]) 
cbar = f.colorbar(im, cax=cbar_ax) 

cbar.locator = tick_locator 
cbar.update_ticks() 
cbar.solids.set_rasterized(True) 
cbar.solids.set_edgecolor("face") 

ziAB, ziBA et ziAA ont été générés lors d'un appel précédent griddata d'interpolation.

J'ai essayé de spécifier deux différentes cartes de couleurs à l'intérieur de chaque appel imshow, j'ai essayé de changer les valeurs de vmax. Mais en vain ...

Si je mets ax0 après ax1-3, puis, il est ax0 qui obtient les bonnes couleurs, et non ax1-3.

J'ai regardé les autres Questions Similaires (Two different color colormaps in the same imshow matplotlib) qui parlent de créer des tableaux masqués ou mon propre colormap, mais en raison de l'origine du fichier png pour ax0, je ne vois pas vraiment comment je devrais procéder.

EDIT:

données Toy:

ziAA = np.random.rand(4, 4, 4) 
ziAB = np.random.rand(4, 4, 4) 
ziBA = np.random.rand(4, 4, 4) 

figure .png Toy: Avec ce chiffre

Toy image

, la couleur uniforme se révèle être blanc. Ma figure actuelle donne un rouge uniforme. Cela suggère qu'en réglant correctement vmin, vmax et peut-être d'autres paramètres de contrôle, on pourrait obtenir que le chiffre png s'affiche correctement. Cependant, je serais intéressé par quelque chose qui fonctionnerait pour le chiffre de ... .png

+2

Pouvez-vous inclure (jouet) dans votre exemple qui reproduit le problème? – thomas

+1

Pourriez-vous modifier votre code pour inclure tick_locator? Un exemple pleinement fonctionnel est beaucoup plus susceptible d'encourager les gens à essayer de résoudre votre problème ... – urschrei

+0

En utilisant 'im0 = ax0.imshow (im2, aspect = 'auto', extent = [- 0.15,0.15,0,4])' semble pour donner un beau résultat pour moi: ce n'est pas ce que tu cherches? – stellasia

Répondre

1

Avec:

im0 = ax0.imshow(im2, aspect='auto',extent=[-0.15,0.15,0,4]) 

qui produit le résultat suivant:

enter image description here