web-dev-qa-db-fra.com

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

Très semblable à cette question mais avec la différence que mon chiffre peut être aussi grand que nécessaire.

J'ai besoin de générer tout un tas de parcelles empilées verticalement dans matplotlib. Le résultat sera enregistré avec figsave et affiché sur une page Web. Par conséquent, la taille de l'image finale est importante tant que les sous-parcelles sont espacées de manière à ne pas se chevaucher.

Quelle que soit la taille de ma figure, les sous-parcelles semblent toujours 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)
237
mcstrother

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 mise en page serrée

enter image description here


Avec mise en page serrée enter image description here

332
Joe Kington

Vous pouvez utiliser plt.subplots_adjust pour modifier l'espacement entre les sous-parcelles (source)

signature d'appel:

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

La signification des paramètres (et les valeurs par défaut suggérées) est la suivante:

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 sont contrôlées par le fichier rc

237
CyanRook

J'ai trouvé que subplots_adjust (hspace = 0.001) est ce qui a finalement fonctionné pour moi. Lorsque j'utilise space = None, il y a toujours un espace blanc entre chaque parcelle. Le fixer à quelque chose de très proche de zéro semble cependant les obliger à s’aligner. Ce que j'ai téléchargé ici n'est pas le code le plus élégant, mais vous pouvez voir comment fonctionne hspace.

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

46
Alexa Halford
import matplotlib.pyplot as plt

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

La méthode plt.subplots_adjust:

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()

o

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

La taille de l'image est importante.

"J'ai essayé de jouer avec hspace, mais son augmentation ne semble que rendre tous les graphiques plus petits sans résoudre le problème de chevauchement."

Ainsi, pour créer plus d’espace et conserver la taille de la sous-parcelle, l’image totale doit être plus grande.

29
The Demz

Vous pouvez essayer le subplot_tool ()

plt.subplot_tool()
18
CiaranWelsh

Semblable à _tight_layout_, matplotlib offre maintenant (à partir de la version 2.2) constrained_layout . Contrairement à _tight_layout_, qui peut être appelé à tout moment dans le code pour une seule présentation optimisée, _constrained_layout_ est une propriété qui peut être active et optimiser la présentation avant chaque étape de dessin.

Par conséquent, il doit être activé avant ou pendant la création d'une sous-parcelle, tel que figure(constrained_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

constrained_layout peut également être défini via rcParams

_plt.rcParams['figure.constrained_layout.use'] = True
_

Voir le quelle est la nouvelle entrée et le Guide de mise en page contraint