web-dev-qa-db-fra.com

Comment puis-je tracer des Pandas _ DataFrames distincts en tant que sous-parcelles?

J'ai quelques Pandas DataFrames partageant la même échelle de valeurs, mais ayant des colonnes et des indices différents. En appelant df.plot(), j'obtiens des images de tracé distinctes. ce que je veux vraiment, c'est qu'ils soient tous dans la même parcelle que les parcelles secondaires, mais malheureusement, je ne parviens pas à trouver de solution et j'apprécierais beaucoup l'aide.

90
Jimmy C

Vous pouvez créer manuellement les sous-parcelles avec matplotlib, puis tracer les images sur une sous-parcelle spécifique à l'aide du mot clé ax. Par exemple pour 4 intrigues secondaires (2x2):

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=2)

df1.plot(ax=axes[0,0])
df2.plot(ax=axes[0,1])
...

Ici, axes est un tableau contenant les différents axes de la sous-parcelle, auquel vous pouvez accéder simplement en indexant axes.
Si vous voulez un axe x partagé, vous pouvez fournir sharex=True à plt.subplots.

190
joris

Vous pouvez voir par exemple. dans le documentation démontrant la réponse de joris. Également dans la documentation, vous pouvez également définir subplots=True et layout=(,) dans la fonction pandas plot:

df.plot(subplots=True, layout=(1,2))

Vous pouvez également utiliser fig.add_subplot() qui prend les paramètres de grille de sous-parcelle tels que 221, 222, 223, 224, etc. comme décrit dans l'article ici . De jolis exemples de tracé sur pandas trame de données, y compris les sous-graphes, sont visibles dans ce cahier ipython .

47
sedeh

Vous pouvez utiliser le style familier Matplotlib pour appeler figure et subplot, mais vous devez simplement spécifier l'axe actuel à l'aide de plt.gca(). Un exemple:

plt.figure(1)
plt.subplot(2,2,1)
df.A.plot() #no need to specify for first axis
plt.subplot(2,2,2)
df.B.plot(ax=plt.gca())
plt.subplot(2,2,3)
df.C.plot(ax=plt.gca())

etc...

14
Q-man

Vous pouvez utiliser ceci:

fig = plt.figure()
ax = fig.add_subplot(221)
plt.plot(x,y)

ax = fig.add_subplot(222)
plt.plot(x,z)
...

plt.show()
3
Joe

Vous n'avez peut-être pas besoin d'utiliser Pandas. Voici un graphique matplotlib des fréquences de chat:

enter image description here

x = np.linspace(0, 2*np.pi, 400)
y = np.sin(x**2)

f, axes = plt.subplots(2, 1)
for c, i in enumerate(axes):
  axes[c].plot(x, y)
  axes[c].set_title('cats')
plt.tight_layout()
2
duhaime

En vous appuyant sur la réponse @joris ci-dessus, si vous avez déjà établi une référence à la sous-parcelle, vous pouvez également utiliser la référence. Par exemple,

ax1 = plt.subplot2grid((50,100), (0, 0), colspan=20, rowspan=10)
...

df.plot.barh(ax=ax1, stacked=True)
1
DaveL17

Vous pouvez tracer plusieurs sous-parcelles de plusieurs pandas trames de données à l'aide de matplotlib avec une simple astuce consistant à créer une liste de toutes les trames de données. Puis utilisez la boucle for pour tracer des intrigues secondaires.

Code de travail:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# dataframe sample data
df1 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
df2 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
df3 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
df4 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
df5 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
df6 = pd.DataFrame(np.random.Rand(10,2)*100, columns=['A', 'B'])
#define number of rows and columns for subplots
nrow=3
ncol=2
# make a list of all dataframes 
df_list = [df1 ,df2, df3, df4, df5, df6]
fig, axes = plt.subplots(nrow, ncol)
# plot counter
count=0
for r in range(nrow):
    for c in range(ncol):
        df_list[count].plot(ax=axes[r,c])
        count=+1

enter image description here

En utilisant ce code, vous pouvez tracer des sous-parcelles dans n'importe quelle configuration. Vous devez simplement définir le nombre de lignes nrow et le nombre de colonnes ncol. Vous devez également créer une liste de trames de données df_list que vous vouliez tracer.

0
Dr. Arslan