webentwicklung-frage-antwort-db.com.de

Mehrere Histogramme in Pandas

Ich möchte das folgende Histogramm (siehe Bild unten) aus dem Buch "Think Stats" erstellen. Ich kann sie jedoch nicht auf dieselbe Handlung bringen. Jeder DataFrame nimmt ein eigenes Subplot. 

Ich habe folgenden Code: 

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()

Der obige Code funktioniert nicht, wenn ich ax = ax1 verwende, wie in vorgeschlagen: pandas Mehrere Plots funktionieren nicht als Hists oder dieses Beispiel macht das, was ich brauche: Überlagern mehrerer Histogramme mit Pandas . Wenn ich den Code so wie er ist verwende, werden zwei Fenster mit Histogrammen erstellt. Irgendwelche Ideen, wie man sie kombiniert? 

Hier ein Beispiel, wie die endgültige Figur aussehen soll: enter image description here

14
Rohit

Soweit ich das beurteilen kann, können Pandas mit dieser Situation nicht umgehen. Das ist in Ordnung, da alle ihre Plotmethoden nur der Bequemlichkeit dienen. Sie müssen matplotlib direkt verwenden. So mache ich es:

%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)

Und das gibt mir: enter image description here

27
Paul H

Von der Pandas-Website ( 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

Für den Fall, dass jemand ein Histogramm über einem anderen zeichnen möchte (statt abwechselnde Balken), können Sie einfach .hist() nacheinander für die Serie aufrufen, die Sie plotten möchten:

%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()

Das gibt Ihnen:

 enter image description here

Beachten Sie, dass die Reihenfolge, die Sie .hist() nennen, von Bedeutung ist (die erste wird hinten sein).

3
lin_bug

Hier ist der Ausschnitt. In meinem Fall habe ich die Ablagen und den Bereich explizit angegeben, da ich die Ausreißer-Entfernung nicht als Autor des Buches behandelt habe.

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

Siehe Matplotlib Multihist-Diagramm mit verschiedenen Größen Beispiel .

1
sathyz

Sie erstellen zwei Datenrahmen und eine Matplotlib-Achse

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

df1 = pd.DataFrame({
    'data1': np.random.randn(10),
    'data2': np.random.randn(10)
})

df2 = df1.copy()

fig, ax = plt.subplots()
df1.hist(column=['data1'], ax=ax)
df2.hist(column=['data2'], ax=ax)
1
Joshua Zastrow