Comment ajouter des légendes et des titres à des histogrammes groupés générés par des Pandas

J'essaie de tracer un histogramme de plusieurs attributs regroupés par un autre attribut, tous dans une trame de données.

Avec l'aide de cette question , je suis en mesure de définir titre pour l'intrigue. Y at-il un moyen facile d'activer la légende pour chaque sous-parcelle.

Voici mon code

import numpy as np
from numpy.random import randn,randint
import pandas as pd
from pandas import DataFrame
import pylab as pl

x=DataFrame(randn(100).reshape(20,5),columns=list('abcde'))
x['new']=pd.Series(randint(0,3,10))
x.hist(by='new')
pl.suptitle('hist by new')

enter image description here

0

1 Réponses

Vous pouvez presque obtenir ce que vous voulez en faisant:

g.plot(kind='bar')

mais il produit une intrigue par groupe (et ne nomme pas les parcelles après les groupes, donc c'est un OMI un peu inutile.)

Voici quelque chose qui semble plutôt beau, mais qui implique beaucoup de travail manuel sur matplotlib , que tout le monde veut éviter, mais personne ne peut:

import numpy.random as rnd
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm

x = pd.DataFrame(rnd.randn(100).reshape(20, 5), columns=list('abcde'))

group_col = 'groups'
groups = ['foo', 'bar', 'baz']
x[group_col] = pd.Series(rnd.choice(groups, len(x)))

g = x.groupby(group_col)
num_groups = g.ngroups

fig, axes = plt.subplots(num_groups)
for i, (k, group) in enumerate(g):
    ax = axes[i]
    ax.set_title(k)
    group = group[[c for c in group.columns if c != group_col]]
    num_columns = len(group.columns)
    colours = cm.Spectral([float(x)/num_columns for x in range(num_columns)])
    ax.hist(group.values, 5, histtype='bar',
            label=list(group.columns), color=colours,
            linewidth=1, edgecolor='white')
    ax.legend()

plt.show()

Which I think gives you what you want: Beautiful histogram


Mettre à jour In response to comments (and as this answer is a few years old) I've tried to strip this answer down to its barest bones. There mai now be a way of labelling plots of groupby objects but I don't know of it.

Voici la manière la plus simple possible de faire ceci:

axes = g.plot(kind='hist')
for i, (groupname, group) in enumerate(g):
    axes[i].set_title(groupname)
0
ajouté
formidable. Donc, il n'y a aucun moyen de faire cela sans avoir les mains sales avec de vraies api matplotlib. Cela devrait être une limitation de pandas, ai-je raison?
ajouté l'auteur vumaasha, source
Je cherche des histogrammes? Comment puis-je convertir les barres en histogrammes?
ajouté l'auteur vumaasha, source
J'ai mis à jour la réponse pour utiliser les histogrammes (et rendre le résultat beaucoup plus joli.)
ajouté l'auteur LondonRob, source
@LondonRob A. Je ne suis pas un gros utilisateur de pandas mais je l'utilise pour gérer un carnet de notes et j'ai besoin de la même aide de vumaasha. Il semble que de nos jours, à partir des pandas 0.20.3, une telle fonctionnalité automatique n'est toujours pas implémentée. Savez-vous arriver à savoir si c'est correct?
ajouté l'auteur saintsfan342000, source