2017-10-16 8 views
-1

J'ai une figure matplotlib avec deux sous-figures, l'une au-dessus de l'autre. Je produis un ensemble de figures similaires, mais je veux seulement les axes, les étiquettes, les titres etc. sur le premier de l'ensemble. Je souhaite ensuite insérer ces éléments dans un document l'un à côté de l'autre afin que les images de sous-repères soient toutes alignées et aient la même taille. Le problème que j'ai, c'est que lorsque je désactive la grille, les axes, la barre de couleurs, etc., les images des sous-placettes se développent pour remplir l'espace précédemment occupé par le texte/les graduations.matplotlib ne redimensionne pas l'image après avoir enlevé l'axe et la barre de couleurs

Existe-t-il un moyen de supprimer les étiquettes de mes axes mais de garder les images de la même taille (par exemple peut-être que matplotlib 'pense' il y a quelque chose mais l'affiche)? J'ai essayé d'insérer des titres vides en utilisant

plt.xlabel('') 

mais cela ne fonctionne pas, et il n'y a pas de méthode similaire pour remplacer les axes. Vous pouvez également spécifier la taille et l'emplacement des sous-figures afin que leurs images soient fixes, qu'elles aient ou non des axes. Je souhaite que les images restent les mêmes lorsque les variables «colorbar» et «grid» sont définies sur «off», au lieu de devenir plus grandes pour remplir l'espace blanc.

Exemple de code:

import numpy as np 
import matplotlib.pyplot as plt 

filename = 'outputimage.png' 
grid = 'on' 
colorbar = 'on' 

r = np.linspace(0,1.0,11) 
z = np.linspace(0,1.0,11) 
data1 = np.zeros([10,10]) 
data2 = np.zeros([10,10]) 
for i in range(10): 
    for j in range(10): 
     data1[i,j] = r[i]*z[j] 
     data2[i,j] = -r[i]*z[j] 
R, Z = np.meshgrid(r, z) 

fig = plt.figure(1,facecolor="white",figsize=(3.5,10),dpi=200) 

plt.subplot(211) 
ax = plt.gca() 
im11 = ax.pcolormesh(R, Z, data1) 
ax.set_aspect('equal',adjustable='box') 
if grid == 'on': 
    plt.axis('on') 
    plt.xlabel(r'r') 
    plt.ylabel(r'z') 
    plt.title('data1') 
else: 
    plt.axis('off') 
    plt.xlabel(' ') 
    plt.ylabel(' ') 
    plt.title(' ') 
if colorbar == 'on': 
    CBI = plt.colorbar(im11, orientation='vertical') 

plt.subplot(212) 
ax = plt.gca() 
im21 = ax.pcolormesh(R, Z, data2) 
ax.set_aspect('equal',adjustable='box') 
plt.xlabel(r'r') 
plt.ylabel(r'z') 
plt.axis('off') 
if colorbar == 'on': 
    CB = plt.colorbar(im21, orientation='vertical') 
if grid == 'on': 
    plt.title('data2') 
else: 
    plt.title(' ') 

plt.tight_layout(h_pad=2.0) 

plt.savefig(filename) 

qui produit: when colorbar and grid set 'on' when colorbar and grid set 'off' wheras Je veux la deuxième image soit identique à la première, juste sans le colorbar et le texte. NB - J'utilise matplotlib2tikz s'il y a un moyen de le faire en utilisant ceci?

+1

Pouvez-vous fournir un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve)? – DavidG

+0

L'ai fait (voir ci-dessus). – FluidFox

+2

@FluidFox Vous n'avez pas: 'FileNotFoundError: [Errno 2] Aucun fichier ou répertoire de ce type: 'output.0008''. D'ailleurs votre code ne ressemble pas à "minimal". – Goyo

Répondre

2

Vous demandez spécifiquement à matplotlib de ne pas garder les axes de la même taille en appelant plt.tight_layout().

Enlevez plt.tight_layout() et vos axes doivent garder la même taille, indépendamment du fait qu'il y ait des étiquettes ou non.

+0

Cela a amélioré les choses, merci. Cependant, maintenant mes titres et étiquettes d'axes se chevauchent et l'ajout de plt.subplots_adjust (wspace = 10) ne semble pas aider. Je reçois également un mouvement à gauche lorsque j'ajoute la barre de couleurs. – FluidFox

+0

Ce sont des problèmes communs auxquels il existe aussi des solutions communes. Ce qui précède répond à la question cependant. Si vous voulez demander quelque chose d'autre, demandez quelque chose d'autre - si les solutions trouvées sur SO n'aident pas, expliquez dans quelle mesure elles ne le sont pas. – ImportanceOfBeingErnest

+0

La solution que j'ai trouvée sur SO pour chevaucher des titres et des étiquettes d'axe était d'utiliser, plt.tight_layout(), mais c'est ce que j'ai maintenant supprimé. Une réponse alternative a suggéré plt.subplots_adjust (wspace = 10), mais cela n'a pas d'effet pour moi. Je vais regarder dans le problème de la barre de couleurs. – FluidFox