11 votes

Matplotlib : Repositionnement d'un sous-plot dans une grille de sous-plots

J'essaie de créer une intrigue avec 7 sous-intrigues. Pour l'instant, je trace deux colonnes, l'une avec quatre tracés et l'autre avec trois, c'est-à-dire comme ceci : enter image description here

Je construis cette parcelle de la manière suivante :

    #! /usr/bin/env python
    import numpy as plotting
    import matplotlib
    from pylab import *
    x = np.random.rand(20)
    y = np.random.rand(20)
    fig = figure(figsize=(6.5,12))
    subplots_adjust(wspace=0.2,hspace=0.2)
    iplot = 420
    for i in range(7):
       iplot += 1
       ax = fig.add_subplot(iplot)
       ax.plot(x,y,'ko')
       ax.set_xlabel("x")
       ax.set_ylabel("y")
    savefig("subplots_example.png",bbox_inches='tight')

Cependant, pour la publication, je pense que c'est un peu laid. Ce que je voudrais faire, c'est déplacer le dernier sous-groupe au centre, entre les deux colonnes. Quelle est donc la meilleure façon d'ajuster la position du dernier sous-plot pour qu'il soit centré ? Par exemple, les 6 premiers sous-plots doivent se trouver dans une grille 3X2 et le dernier sous-plot doit être centré entre les deux colonnes. Dans la mesure du possible, j'aimerais pouvoir conserver le format for afin que je puisse simplement utiliser :

    if i == 6:
       # do something to reposition/centre this plot     

Merci,

Alex

15voto

tcaswell Points 21489

Utiliser la grille de spécifications (doc) avec une grille 4x4, et que chaque parcelle s'étende sur 2 colonnes comme tel :

import matplotlib.gridspec as gridspec
gs = gridspec.GridSpec(4, 4)
ax1 = plt.subplot(gs[0, 0:2])
ax2 = plt.subplot(gs[0,2:])
ax3 = plt.subplot(gs[1,0:2])
ax4 = plt.subplot(gs[1,2:])
ax5 = plt.subplot(gs[2,0:2])
ax6 = plt.subplot(gs[2,2:])
ax7 = plt.subplot(gs[3,1:3])
fig = gcf()
gs.tight_layout(fig)
ax_lst = [ax1,ax2,ax3,ax4,ax5,ax6,ax7]

9voto

drs Points 1534

Si vous voulez garder la boucle for, vous pouvez arranger vos parcelles avec subplot2grid qui permet un colspan paramètre :

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(20)
y = np.random.rand(20)
fig = plt.figure(figsize=(6.5,12))
plt.subplots_adjust(wspace=0.2,hspace=0.2)
iplot = 420
for i in range(7):
    iplot += 1
    if i == 6:
        ax = plt.subplot2grid((4,8), (i//2, 2), colspan=4)
    else:
        # You can be fancy and use subplot2grid for each plot, which doesn't
        # require keeping the iplot variable:
        # ax = plt.subplot2grid((4,2), (i//2,i%2))

        # Or you can keep using add_subplot, which may be simpler:
        ax = fig.add_subplot(iplot)
    ax.plot(x,y,'ko')
    ax.set_xlabel("x")
    ax.set_ylabel("y")
plt.savefig("subplots_example.png",bbox_inches='tight')

subplots in a grid with colspan

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X