Améliorer la taille/l'espacement des sous-parcelles avec de nombreuses sous-parcelles dans le matplotlib

très similaire à cette question mais avec la différence que mon chiffre peut être aussi grand qu'il doit être.

je dois générer un tas entier de parcelles empilées verticalement dans matplotlib. Le résultat sera sauvegardé en utilisant figsave et visualisé sur une page web, donc je ne me soucie pas de la taille de l'image finale tant que les sous-lots sont espacés de sorte qu'ils ne se chevauchent pas.

peu importe la taille que je permets à la figure d'être, les sous-lots toujours semblent se chevaucher.

mon code ressemble actuellement à

import matplotlib.pyplot as plt
import my_other_module

titles, x_lists, y_lists = my_other_module.get_data()

fig = plt.figure(figsize=(10,60))
for i, y_list in enumerate(y_lists):
    plt.subplot(len(titles), 1, i)
    plt.xlabel("Some X label")
    plt.ylabel("Some Y label")
    plt.title(titles[i])
    plt.plot(x_lists[i],y_list)
fig.savefig('out.png', dpi=100)
194
demandé sur Community 2011-07-01 01:09:11

6 réponses

essayez d'utiliser plt.tight_layout

comme exemple rapide:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4)
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

Sans Disposition Serrée

enter image description here


enter image description here

263
répondu Joe Kington 2012-03-22 17:55:12

vous pouvez utiliser plt.subplots_adjust pour changer l'espacement entre les sous-lots (source)

appel de la signature:

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

les significations des paramètres (et les valeurs par défaut suggérées) sont:

left  = 0.125  # the left side of the subplots of the figure
right = 0.9    # the right side of the subplots of the figure
bottom = 0.1   # the bottom of the subplots of the figure
top = 0.9      # the top of the subplots of the figure
wspace = 0.2   # the amount of width reserved for blank space between subplots
hspace = 0.2   # the amount of height reserved for white space between subplots

les valeurs par défaut réelles sont contrôlées par le fichier rc

191
répondu CyanRook 2016-11-23 15:20:54

j'ai trouvé que subplots_adjust(hspace = 0.001) est ce qui a fini par fonctionner pour moi. Quand j'utilise space = None, Il y a encore de l'espace blanc entre chaque parcelle. Le fixer à quelque chose de très proche de zéro semble toutefois les forcer à s'aligner. Ce que j'ai téléchargé ici n'est pas le plus élégant morceau de code, mais vous pouvez voir comment l'hspace fonctionne.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure()

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(5):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x,y)
    plt.subplots_adjust(hspace = .001)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

enter image description here

40
répondu Alexa Halford 2012-03-22 17:43:54
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,60))
plt.subplots_adjust( ... )

Le plt.sous-plots_adjust méthode:

def subplots_adjust(*args, **kwargs):
    """
    call signature::

      subplots_adjust(left=None, bottom=None, right=None, top=None,
                      wspace=None, hspace=None)

    Tune the subplot layout via the
    :class:`matplotlib.figure.SubplotParams` mechanism.  The parameter
    meanings (and suggested defaults) are::

      left  = 0.125  # the left side of the subplots of the figure
      right = 0.9    # the right side of the subplots of the figure
      bottom = 0.1   # the bottom of the subplots of the figure
      top = 0.9      # the top of the subplots of the figure
      wspace = 0.2   # the amount of width reserved for blank space between subplots
      hspace = 0.2   # the amount of height reserved for white space between subplots

    The actual defaults are controlled by the rc file
    """
    fig = gcf()
    fig.subplots_adjust(*args, **kwargs)
    draw_if_interactive()

ou

fig = plt.figure(figsize=(10,60))
fig.subplots_adjust( ... )

la taille de l'image Compte.

" j'ai essayé de jouer avec hspace, mais l'augmenter semble seulement rendre tous les graphiques plus petits sans résoudre le problème de chevauchement."

ainsi pour faire plus d'espace blanc et garder la taille de la sous-parcelle de l'image totale doit être plus grand.

27
répondu The Demz 2016-11-23 14:52:50

vous pouvez essayer le sous-plot_tool ()

plt.subplot_tool()
13
répondu CiaranWelsh 2015-07-18 11:55:03

similaire à tight_layout matplotlib maintenant (à partir de la version 2.2) fournit contrained_layout . Contrairement à tight_layout , qui peut être appelé à tout moment dans le code pour une disposition optimisée unique, constrained_layout est une propriété, qui peut être active et optimisera la disposition avant chaque étape de dessin.

par conséquent, il doit être activé avant ou pendant la création de sous-parcelles. Cela peut arriver comme argument à figure(contrained_layout=True) ou subplots(constrained_layout=True) .

exemple:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

enter image description here

peut aussi bien être défini via rcParams

plt.rcParams['figure.constrained_layout.use'] = True

voir la quoi de neuf? et le Guide de mise en page tronqué

0
répondu ImportanceOfBeingErnest 2018-08-02 15:25:08