web-dev-qa-db-fra.com

Histogrammes multiples dans les pandas

Je voudrais créer l'histogramme suivant (voir image ci-dessous) tiré du livre "Think Stats". Cependant, je ne peux pas les avoir sur le même terrain. Chaque DataFrame prend sa propre sous-parcelle. 

J'ai le code suivant: 

import nsfg
import matplotlib.pyplot as plt
df = nsfg.ReadFemPreg()
preg = nsfg.ReadFemPreg()
live = preg[preg.outcome == 1]

first = live[live.birthord == 1]
others = live[live.birthord != 1]

#fig = plt.figure()
#ax1 = fig.add_subplot(111)

first.hist(column = 'prglngth', bins = 40, color = 'teal', \
           alpha = 0.5)
others.hist(column = 'prglngth', bins = 40, color = 'blue', \
            alpha = 0.5)
plt.show()

Le code ci-dessus ne fonctionne pas lorsque j'utilise ax = ax1 comme suggéré dans: pandas. Plusieurs parcelles ne fonctionnent pas comme hists . Cet exemple ne fait pas ce dont j'ai besoin: Superposition de plusieurs histogrammes à l'aide de pandas . Lorsque j'utilise le code tel quel, il crée deux fenêtres avec des histogrammes. Des idées comment les combiner? 

Voici un exemple de ce que j'aimerais que le chiffre final ressemble: enter image description here

14
Rohit

Autant que je sache, les pandas ne peuvent pas gérer cette situation. Ce n'est pas grave, car toutes leurs méthodes de traçage ne sont utilisées que par commodité. Vous devrez utiliser matplotlib directement. Voici comment je le fais:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas
#import seaborn
#seaborn.set(style='ticks')

np.random.seed(0)
df = pandas.DataFrame(np.random.normal(size=(37,2)), columns=['A', 'B'])
fig, ax = plt.subplots()

a_heights, a_bins = np.histogram(df['A'])
b_heights, b_bins = np.histogram(df['B'], bins=a_bins)

width = (a_bins[1] - a_bins[0])/3

ax.bar(a_bins[:-1], a_heights, width=width, facecolor='cornflowerblue')
ax.bar(b_bins[:-1]+width, b_heights, width=width, facecolor='seagreen')
#seaborn.despine(ax=ax, offset=10)

Et cela me donne: enter image description here

27
Paul H

Sur le site web des pandas ( http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization-hist ):

df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
                    'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

plt.figure();

df4.plot(kind='hist', alpha=0.5)
6
blalterman

Si quelqu'un veut tracer un histogramme sur un autre (plutôt que des barres alternées), vous pouvez simplement appeler .hist() consécutivement sur la série que vous souhaitez tracer:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas


np.random.seed(0)
df = pandas.DataFrame(np.random.normal(size=(37,2)), columns=['A', 'B'])

df['A'].hist()
df['B'].hist()

Cela vous donne:

 enter image description here

Notez que l'ordre que vous appelez .hist() est important (le premier sera à l'arrière)

3
lin_bug

Voici l'extrait de code. Dans mon cas, j'ai explicitement spécifié les bacs et la plage, car je ne gérais pas la suppression des valeurs aberrantes en tant qu'auteur du livre.

fig, ax = plt.subplots()
ax.hist([first.prglngth, others.prglngth], 10, (27, 50), histtype="bar", label=("First", "Other"))
ax.set_title("Histogram")
ax.legend()

Reportez-vous au graphique multihiste Matplotlib avec différentes tailles exemple .

1
sathyz