Comment faire plusieurs graphiques sur une seule page en utilisant matplotlib?

89

J'ai écrit un code qui ouvre 16 chiffres à la fois. Actuellement, ils s'ouvrent tous sous forme de graphiques séparés. J'aimerais qu'ils s'ouvrent tous sur la même page. Pas le même graphique. Je veux 16 graphiques séparés sur une seule page / fenêtre. Aussi, pour une raison quelconque, le format des numbins et defaultreallimits ne tient pas au-delà de la figure 1. Dois-je utiliser la commande subplot? Je ne comprends pas pourquoi je devrais le faire mais je ne peux pas comprendre ce que je ferais d'autre?

import csv
import scipy.stats
import numpy
import matplotlib.pyplot as plt

for i in range(16):
    plt.figure(i)
    filename= easygui.fileopenbox(msg='Pdf distance 90m contour', title='select file', filetypes=['*.csv'], default='X:\\herring_schools\\')
    alt_file=open(filename)    
    a=[]
    for row in csv.DictReader(alt_file):
        a.append(row['Dist_90m(nmi)'])
    y= numpy.array(a, float)    
    relpdf=scipy.stats.relfreq(y, numbins=7, defaultreallimits=(-10,60))
    bins = numpy.arange(-10,60,10)
    print numpy.sum(relpdf[0])
    print bins
    patches=plt.bar(bins,relpdf[0], width=10, facecolor='black')
    titlename= easygui.enterbox(msg='write graph title', title='', default='', strip=True, image=None, root=None)
    plt.title(titlename)
    plt.ylabel('Probability Density Function')
    plt.xlabel('Distance from 90m Contour Line(nm)')
    plt.ylim([0,1])

plt.show()
FS.
la source

Réponses:

15

Pour répondre à votre question principale, vous souhaitez utiliser la commande subplot . Je pense que changer plt.figure(i)pour plt.subplot(4,4,i+1)devrait fonctionner.

las3rjock
la source
199

La réponse de las3rjock , qui est en quelque sorte la réponse acceptée par l'OP, est incorrecte - le code ne s'exécute pas, ni la syntaxe matplotlib valide; cette réponse ne fournit aucun code exécutable et ne dispose d'aucune information ou suggestion que l'OP pourrait trouver utile pour écrire son propre code pour résoudre le problème dans l'OP.

Étant donné que c'est la réponse acceptée et qu'elle a déjà reçu plusieurs votes positifs, je suppose qu'une petite déconstruction s'impose.

Tout d' abord, appeler intrigue secondaire ne pas vous donner plusieurs parcelles; subplot est appelé pour créer un seul tracé, ainsi que pour créer plusieurs tracés. De plus, "changer plt.figure (i)" n'est pas correct.

plt.figure () (dans lequel plt ou PLT est généralement la bibliothèque pyplot de matplotlib importée et rebondie comme une variable globale, plt ou parfois PLT, comme ceci:

from matplotlib import pyplot as PLT

fig = PLT.figure()

la ligne juste au-dessus crée une instance de figure matplotlib; La méthode add_subplot de cet objet est alors appelée pour chaque fenêtre de traçage (pensez de manière informelle à un axe x & y comprenant un seul sous-tracé). Vous créez (que ce soit juste un ou plusieurs sur une page), comme ça

fig.add_subplot(111)

cette syntaxe équivaut à

fig.add_subplot(1,1,1)

choisissez celui qui vous convient.

Ci-dessous, j'ai répertorié le code pour tracer deux graphiques sur une page, l'un au-dessus de l'autre. Le formatage se fait via l'argument passé à add_subplot . Notez que l'argument est ( 211 ) pour le premier graphique et ( 212 ) pour le second.

from matplotlib import pyplot as PLT

fig = PLT.figure()

ax1 = fig.add_subplot(211)
ax1.plot([(1, 2), (3, 4)], [(4, 3), (2, 3)])

ax2 = fig.add_subplot(212)
ax2.plot([(7, 2), (5, 3)], [(1, 6), (9, 5)])

PLT.show()

Chacun de ces deux arguments est une spécification complète pour placer correctement les fenêtres de tracé respectives sur la page.

211 (qui encore une fois, pourrait également être écrit sous forme de 3 tuples comme (2,1,1) signifie deux lignes et une colonne de fenêtres de tracé; le troisième chiffre spécifie l'ordre de cette fenêtre de sous-tracé particulier par rapport aux autres fenêtres de sous-tracé- -dans ce cas, c'est le premier tracé (qui le place sur la ligne 1) d'où le tracé numéro 1, ligne 1 col 1.

L'argument passé au deuxième appel à add_subplot , ne diffère du premier que par le chiffre de fin (un 2 au lieu d'un 1, car ce tracé est le deuxième tracé (ligne 2, col 1).

Un exemple avec plus de tracés: si à la place vous vouliez quatre tracés sur une page, dans une configuration matricielle 2x2, vous appelleriez quatre fois la méthode add_subplot, en passant ces quatre arguments (221), (222), (223) et ( 224), pour créer quatre tracés sur une page à 10, 2, 8 et 4 heures, respectivement et dans cet ordre.

Notez que chacun des quatre arguments contient deux lignes de tête 2 - qui encode la configuration 2 x 2, c'est-à-dire deux lignes et deux colonnes.

Le troisième chiffre (le plus à droite) dans chacun des quatre arguments encode l'ordre de cette fenêtre de tracé particulière dans la matrice 2 x 2 - c'est-à-dire, ligne 1 col 1 (1), ligne 1 col 2 (2), ligne 2 col 1 (3), ligne 2 col 2 (4).

doug
la source
1
add_subplot peut prendre un seul argument entier pour un petit nombre de sous-graphiques, mais une fois que vous avez besoin de plus de 9 sous-graphiques, vous devez utiliser la version des autres réponses qui prend 3 arguments entiers séparés.
user1244215
1
puis-je utiliser à la fig.add_axes(rect)place de add_subplot?
Alcott
15
PLT? Jamais vu cela utilisé auparavant
Darshan Chaudhary
3
Votre premier paragraphe ici est manifestement faux, comme vous pouvez le vérifier en exécutant for i in range(16): plt.subplot(4, 4, i+1)et n'observer aucune erreur de syntaxe. La réponse est acceptée car elle a probablement fait ce que le PO voulait.
chthonicdaemon
3
C'est une bonne solution. Mais si je veux utiliser une variable pour boucler, comment faire?
Pengju Zhao
83

Puisque cette question remonte à 4 ans, de nouvelles choses ont été implémentées et parmi elles, il y a une nouvelle fonction plt.subplotsqui est très pratique :

fig, axes = plot.subplots(nrows=2, ncols=3, sharex=True, sharey=True)

axesest un numpy.ndarraydes objets AxesSubplot, ce qui rend très pratique de parcourir les différents sous-graphiques en utilisant simplement des indices de tableau [i,j].

Saullo GP Castro
la source
Cela fonctionne-t-il également pour les cas où je dois utiliser l'API matplotlib uniquement (en raison de l'affichage non disponible et d'autres choses amusantes)?
eudoxos
2
@eudoxos oui, il devrait, vous pouvez créer les sous-graphiques comme celui-ci afin d'imprimer plusieurs graphiques sur une seule page, par exemple, sans avoir besoin de montrer ce qui est fait
Saullo GP Castro
12

Cela fonctionne aussi:

for i in range(19):
    plt.subplot(5,4,i+1) 

Il trace 19 graphiques au total sur une page. Le format est 5 en bas et 4 en travers.

FS.
la source
4

La réponse de @doug & FS est de très bonnes solutions. Je souhaite partager la solution pour l'itération sur pandas.dataframe.

import pandas as pd
df=pd.DataFrame([[1, 2], [3, 4], [4, 3], [2, 3]])
fig = plt.figure(figsize=(14,8))
for i in df.columns:
    ax=plt.subplot(2,1,i+1) 
    df[[i]].plot(ax=ax)
    print(i)
plt.show()
Pengju Zhao
la source
Si votre for i,col in enumerate(df.columns):
bloc de