Créer plus d'un graphique dans la même cellule IPython Notebook

87

J'ai démarré mon notebook IPython avec

ipython notebook --pylab inline

Ceci est mon code dans une cellule

df['korisnika'].plot()
df['osiguranika'].plot()

Cela fonctionne bien, il dessinera deux lignes, mais sur le même graphique.

Je voudrais dessiner chaque ligne sur un graphique séparé. Et ce serait formidable si les graphiques étaient côte à côte, pas les uns après les autres.

Je sais que je peux mettre la deuxième ligne dans la cellule suivante, puis j'aurais deux graphiques. Mais j'aimerais que les graphiques soient proches les uns des autres, car ils représentent la même unité logique.

WebOrCode
la source

Réponses:

88

Créez d'abord les axes multiples et transmettez-les à la fonction de tracé Pandas, comme:

fig, axs = plt.subplots(1,2)

df['korisnika'].plot(ax=axs[0])
df['osiguranika'].plot(ax=axs[1])

Il vous donne toujours 1 chiffre, mais avec deux parcelles différentes l'une à côté de l'autre.

Rutger Kassies
la source
3
Cela fonctionne. Maintenant, je ne changerai pas la taille de l'image. Je peux le faire avec fig, axs = plt.subplots (1,2, figsize = (15, 5)). Existe-t-il un moyen de définir la taille de l'image en pixels?
WebOrCode
1
L'utilisation de la taille de la figure est en effet le moyen, c'est la taille en pouces. Le nombre de pixels dépend du ppp, qui est fixe pour l'affichage à l'écran. Mais pour l'enregistrement, il peut être défini en ajoutant le mot-clé dpi.
Rutger Kassies
2
Il n'est pas tout à fait exact que le dpi soit fixé pour l'affichage à l'écran (enfin, c'est le cas et ce n'est pas le cas). IPython affiche les images uniquement en fonction de leur taille de pixel, et cette taille de pixel est déterminée dans matplotlib en multipliant la taille de la figure en pouces par la savefig.dpiconfiguration. Les figures en ligne utilisent le même chemin savefig que les fichiers d'écriture.
minrk
Merci d'avoir signalé cela, je ne savais pas que cela fonctionnait comme ça. Ne serait-il pas plus pratique si le dpi d'affichage était pris en compte (également), car c'est facile à définir lors de la création de la figure. Pour le savefig.dpi, je ne connais pas d'autre moyen que mpl.rcParams['savefig.dpi'] = 120. Pour l'affichage dpi, il y a un mot-clé dans de nombreux endroits, comme plt.figure(dpi=120), mais c'est ignoré maintenant, d'où ma fausse hypothèse à propos de sa correction.
Rutger Kassies
101

Vous pouvez également appeler la fonction show () après chaque tracé. par exemple

   plt.plot(a)
   plt.show()
   plt.plot(b)
   plt.show()
Tooblippe
la source
1
Génial, mais comment définir l'emplacement de l'image du tracé, comme (2,2) ou (1,2)?
Pythoner
3
Avec cette option, les tracés apparaissent nécessairement les uns après les autres. Pour plus de contrôle sur la mise en page générale, pyplot.subplots()c'est la voie à suivre.
Eric O Lebigot
1
J'ai supprimé le lien.
Tooblippe
12

Quelque chose comme ça:

import matplotlib.pyplot as plt
... code for plot 1 ...
plt.show()
... code for plot 2...
plt.show()

Notez que cela fonctionnera également si vous utilisez le seabornpackage pour le traçage:

import matplotlib.pyplot as plt
import seaborn as sns
sns.barplot(... code for plot 1 ...) # plot 1
plt.show()
sns.barplot(... code for plot 2 ...) # plot 2
plt.show()
mgoldwasser
la source
11

Une autre façon, pour la variété. Bien que ce soit un peu moins flexible que les autres. Malheureusement, les graphiques apparaissent les uns au-dessus des autres, plutôt que côte à côte, ce que vous avez demandé dans votre question initiale. Mais c'est très concis.

df.plot(subplots=True)

Si le dataframe a plus que les deux séries et que vous ne voulez tracer que ces deux, vous devrez remplacer dfpar df[['korisnika','osiguranika']].

Luciano
la source
2

Je ne sais pas s'il s'agit d'une nouvelle fonctionnalité, mais cela tracera sur des figures séparées:

df.plot(y='korisnika')
df.plot(y='osiguranika')

alors que cela tracera sur la même figure: (tout comme le code dans l'op)

df.plot(y=['korisnika','osiguranika'])

J'ai trouvé cette question parce que j'utilisais l'ancienne méthode et que je voulais qu'ils tracent sur le même chiffre, donc votre question était en fait ma réponse.

Steven
la source