2 votes

Créez 6 sous-graphiques à barres basés sur les colonnes du dataframe

J'ai un diagramme en barres qui ressemble un peu à ceci : fig1

J'espère réaliser six diagrammes en barres différents (un par "saison", par exemple MAM 16) basés sur les colonnes de mon dataframe dat.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

labels = {'pod','MAM-16',  'MAM-17',  'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72',  '82',  '184.4',   '143.3',  '12.7',  '120',  '152.4'),
('79',  '76.5',    '167.4',   '118.1',   '185.4',  '190', '145'),
('86',  '993.4',   '66.5',    '198.9',   '14', '78', '84.8'),
('87',  '206.2',   '178.1',   '121.4',   '285.2',  '89' ,'65'),
('88',  '209.3',   '280.4',  '138.4',   '279.9', '84',  '141'),
('90' , '134.9',   '137.9',   '92.7',    '224', '111', '133.1'),
('93',  '180.8',   '113.8',   '179.6',   '108.2', '184',  '211.8'),
('95',  '329.7',   '176.5',   '168.9',   '64', '75','103.6'),
('96', '270.5',   '158.5',   '196.6',   '363', '128','152.4'),
('97',  '167.9',   '103.1',   '184.4',   '117.1',  '132', '104.1'),
dat = pd.DataFrame.from_records(rf, columns=labels); dat

La première colonne de dat fait référence à un ID différent qui correspond aux barres colorées dans la figure ci-dessus et n'est pas numérique. Le reste des valeurs sont numériques.

Je sais que je peux tracer toutes les valeurs ensemble en utilisant quelque chose comme ceci :

ax = dat.plot(kind='bar',rot=0,lw=2,colormap='jet',figsize=(10,4),
             title='Titre d'exemple')
x1 = [0,1,2,3,4,5]
labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
ax1.set_xticks(x1)
ax1.set_xticklabels(labels, minor=False, rotation=45)
ax.set_xticklabels(labels)
plt.show()

Pour obtenir des sous-graphiques, je suppose que je pourrais utiliser une boucle for :

for col in dat:    
    fig = plt.figure(figsize=(5.0, 6.0))

    axes1 = fig.add_subplot(3, 2, 1)
    axes2 = fig.add_subplot(3, 2, 2)
    axes3 = fig.add_subplot(3, 2, 3)

    axes1.set_ylabel('pluie / mm')
    axes1.plot(???)

    axes2.set_ylabel('pluie totale / mm')
    axes2.plot(???)

    axes3.set_ylabel('pluie totale / mm')
    axes3.plot(???)

    fig.tight_layout()
    plt.show()

Le résultat devrait être une matrice de sous-graphiques 2x3 où chaque groupe de diagrammes en barres de l'image (fig1) ci-dessus est son propre graphique.

4voto

ImportanceOfBeingErnest Points 119438

Vous voulez utiliser les arguments subplots=True et layout de la fonction de traçage. Cela permet d'obtenir une grille de sous-graphiques des parcelles.

Voici un exemple exécutable (où j'ai remplacé les chaînes "mean" et "var" par quelque chose d'utile).

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

labels = {'pod','MAM-16',  'MAM-17',  'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72',  '82',  '184.4',   '143.3',  '12.7',  '120',  '152.4'),
('79',  '76.5',    '167.4',   '118.1',   '185.4',  '190', '145'),
('86',  '993.4',   '66.5',    '198.9',   '14', '78', '84.8'),
('87',  '206.2',   '178.1',   '121.4',   '285.2',  '89' ,'65'),
('88',  '209.3',   '280.4',  '138.4',   '279.9', '84',  '141'),
('90' , '134.9',   '137.9',   '92.7',    '224', '111', '133.1'),
('93',  '180.8',   '113.8',   '179.6',   '108.2', '184',  '211.8'),
('95',  '329.7',   '176.5',   '168.9',   '64', '75','103.6'),
('96', '270.5',   '158.5',   '196.6',   '363', '128','152.4'),
('97',  '167.9',   '103.1',   '184.4',   '117.1',  '132', '104.1'),
('98', '394', '204.6',   '53.6',    '332.5', '85',  '103.4'),
('99', '243', '103.6',   '33.2',    '112.5', '25',  '37.9')]   
dat = pd.DataFrame.from_records(rf, columns=labels).astype(float)

labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
dat = dat[['MAM-16',  'MAM-17',  'JJAS-16', 'JJAS-17', 'OND-15','OND-16']]
axes = dat.plot(kind='bar',rot=0,lw=2,colormap='jet',figsize=(10,4),
             title='Titre de l'échantillon', subplots=True, layout=(3,2))

plt.show()

entrez ici la description de l'image

Pour définir les couleurs des barres différemment, vous devez les définir manuellement.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

labels = {'pod','MAM-16',  'MAM-17',  'JJAS-16', 'JJAS-17', 'OND-15','OND-16'}
rf = [('22','343.7','467.4', '157', '251', '100','142.5'),
('72',  '82',  '184.4',   '143.3',  '12.7',  '120',  '152.4'),
('79',  '76.5',    '167.4',   '118.1',   '185.4',  '190', '145'),
('86',  '993.4',   '66.5',    '198.9',   '14', '78', '84.8'),
('87',  '206.2',   '178.1',   '121.4',   '285.2',  '89' ,'65'),
('88',  '209.3',   '280.4',  '138.4',   '279.9', '84',  '141'),
('90' , '134.9',   '137.9',   '92.7',    '224', '111', '133.1'),
('93',  '180.8',   '113.8',   '179.6',   '108.2', '184',  '211.8'),
('95',  '329.7',   '176.5',   '168.9',   '64', '75','103.6'),
('96', '270.5',   '158.5',   '196.6',   '363', '128','152.4'),
('97',  '167.9',   '103.1',   '184.4',   '117.1',  '132', '104.1'),
('98', '394', '204.6',   '53.6',    '332.5', '85',  '103.4'),
('99', '243', '103.6',   '33.2',    '112.5', '25',  '37.9')]   
dat = pd.DataFrame.from_records(rf, columns=labels).astype(float)

labels = ['MAM 16', 'MAM 17', 'JJAS 16','JJAS 17', 'OND 15','OND 16']
dat = dat[['MAM-16',  'MAM-17',  'JJAS-16', 'JJAS-17', 'OND-15','OND-16']]

axes = dat.plot(kind='bar',rot=0,lw=2, figsize=(10,4), legend=False,
             title='Titre de l'échantillon', subplots=True, layout=(3,2))
colors = plt.cm.jet(np.linspace(0,1,len(dat)))
for ax in axes.flat:
    for i,bar in enumerate(ax.patches):
        bar.set_color(colors[i])
plt.show()

entrez ici la description de l'image

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