2017-01-05 2 views
3

Ich habe einen Pandas Datenrahmen namens clean, der eine Spalte v enthält, für die ich ein Histogramm zeichnen und ein Dichtediagramm überlagern möchte. Ich weiß, dass ich eine unter dem anderen auf diese Weise zeichnen können:Überlagerung von Histogramm und Dichte in Pandas/Matplotlib in Python

import pandas as pd 
import matplotlib.pyplot as plt 

Maxv=200 

plt.subplot(211) 
plt.hist(clean['v'],bins=40, range=(0, Maxv), color='g') 
plt.ylabel("Number") 

plt.subplot(212) 
ax=clean['v'].plot(kind='density') 
ax.set_xlim(0, Maxv) 
plt.xlabel("Orbital velocity (km/s)") 
ax.get_yaxis().set_visible(False) 

enter image description here

Aber wenn ich versuche zu überlagern, y Waage entspricht nicht (und ich verlieren y-Achse Zecken und Etiketten):

yhist, xhist, _hist = plt.hist(clean['v'],bins=40, range=(0, Maxv), color='g') 
plt.ylabel("Number") 

ax=clean['v'].plot(kind='density') #I would like to insert here a normalization to max(yhist)/max(ax) 
ax.set_xlim(0, Maxv) 
plt.xlabel("Orbital velocity (km/s)") 
ax.get_yaxis().set_visible(False) 

enter image description here

Einige Hinweis? (Zusätzliche Frage: Wie kann ich die Breite der Dichteglättungs ändern?)

+1

[diese Antwort sollte helfen] (http://stackoverflow.com/a/39987117/2336654) – piRSquared

+0

Ja, tut es, danke. Ich muss nur herausfinden, dass ich die x-Bereichsgröße einstellen und die zweite y-Achse verstecken soll ... Danke! – Matt

+0

Warum verwenden Sie nicht ['seaborn'] (http://seaborn.pydata.org/tutorial/distributions.html#plotting-univariate-distributions)? – IanS

Antwort

1

Nein Ich versuche dies:

ax = clean.v.plot(kind='hist', bins=40, range=(0, Maxv)) 
clean.v.plot(kind='kde', ax=ax, secondary_y=True) 

Aber der Bereich Teil nicht funktioniert, und ther ist immer noch das linke y-Achse Problem

enter image description here

+1

Versuchen Sie, den Bereich nach dem Plotten einzustellen: 'ax.set (xlim = [0, Maxv])' – IanS

+0

Für die linke y-Achse siehe [diese Antwort] (http://stackoverflow.com/a/17877159/5276797). – IanS

+0

@IanS: vielen Dank, es funktioniert für den Bereich. :) Ich bin zwar nicht mit der y-Achse erfolgreich, aber ich denke, es ist weniger wichtig. – Matt

4

Basierend auf Ihren Code, sollte diese Arbeit:

ax = clean.v.plot(kind='hist', bins=40, normed=True) 
clean.v.plot(kind='kde', ax=ax, secondary_y=True) 
ax.set(xlim=[0, Maxv]) 

Sie brauchen nicht einmal mehr die secondary_y.

+0

Sehr sauber. Ich habe das 'secondary_y' wirklich losgeworden. Die einzige Sache ist, dass ich die wirkliche Zählung (von hist) in y verloren habe, die jetzt normalisiert ist, aber ich denke, das ist auch in Ordnung. – Matt

Verwandte Themen