2017-05-29 3 views
0

ich versuche, ein Balkendiagramm in Pandas zu machen, mit zwei Datenreihen von einem groupby kommen:Pandas Balkendiagramm mit kontinuierlicher x-Achse

data.groupby(['popup','UID']).size().groupby(level=0).value_counts().unstack().transpose().plot(kind='bar', layout=(2,2)) 

Die x-Achse ist nicht kontinuierlich, und zeigt nur Werte, die in der sind Datensatz. In diesem Beispiel springt es von 11 nach 13.

Wie kann ich es kontinuierlich machen?

BarChart

** EDIT 2: **

Ich versuchte JohnE datacentric Ansatz, und es funktioniert. Es erstellt einen neuen Index ohne fehlende Werte:

temp = data.groupby(['popup','UID']).size().groupby(level=0).value_counts().unstack().transpose() 
temp.reindex(np.arange(temp.index.min(), temp.index.max())).plot(kind='bar', layout=(2,2)) 

Result

Aber ich nehme an, es sollte mit Histogramm statt Balkendiagramm ein besserer Ansatz sein. Das Beste, was ich mit Histogrammen tun konnte, ist:

data.groupby(['popup','UID']).size().groupby(level=0).plot(kind='hist', bins=30, alpha=0.5, layout=(2,2), legend=True)  

Result

Aber ich habe keine Möglichkeit, in hist Grundstück findet das gleiche Rendering als Balkendiagramm, ohne bar überlappend zu erhalten.

** EDIT: ** Hier sind einige Informationen, um Kommentare zu beantworten.

Daten Beispiel:

 INSEE C1 popup C3     date \ 
0 75101.0 0.0  0 NaN 2017-05-17T13:20:16Z 
0 75101.0 0.0  0 NaN 2017-05-17T14:23:51Z 
1 31557.0 0.0  1 NaN 2017-05-17T14:58:27Z 

            UID 
0 ba4bd353-f14d-4bc5-95ba-6a1f5134cc84 
0 ba4bd353-f14d-4bc5-95ba-6a1f5134cc84 
1 bafe9715-3a07-4d9b-b85c-0bbf658a9115 

Erste groupby Ergebnis (Probe):

data.groupby(['popup','UID']).size().head(3) 
popup UID         
0  016d3e7e-1901-4f84-be0e-117988ec57a8 6 
     01c15455-29cc-4d1e-8743-638fd0f51602 6 
     03fc9eb0-c5fb-4205-91f0-4b74f78a8b96 3 
dtype: int64 

Zweite groupby Ergebnis (Probe):

data.groupby(['popup','UID']).size().groupby(level=0).value_counts().head(3) 
popup 
0  1 46 
     3 23 
     4 22 
dtype: int64 

Nach Entstapelungsunterdrückung und transponieren:

data.groupby(['popup','UID']).size().groupby(level=0).value_counts().unstack().transpose().head(3)

popup  0  1 
1  46.0 38.0 
2  21.0 35.0 
3  23.0 22.0 

+0

Können Sie Beispieldaten posten? Wie sieht groupby output aus? –

+0

Ich weiß nicht über Plot-Optionen, aber Sie könnten einen datenzentrischen Ansatz nehmen und einfach mit allen gewünschten Werten auf der x-Achse neu indizieren. Vielleicht mit einer Fillna auch? z.B. 'df.reindex (Bereich (30)). fillna (0)' – JohnE

Antwort

0

Es gibt eine Lösung mit Histogramm Plot von matplotlib.axes.Axes.hist. Es ist besser, zu diesem Zweck Histogramme als Balkendiagramme zu verwenden, da wir die Anzahl der Bins auswählen können.

# Separate groups by 'popup' and count number of records for each 'UID' 
popup_values = data['popup'].unique() 
count_by_popup = [data[data['popup'] == popup_value].groupby(['UID']).size() for popup_value in popup_values] 

# Create histogram 
fig, ax = plt.subplots() 
ax.hist(count_by_popup, 20, histtype='bar', label=[str(x) for x in popup_values]) 
ax.legend() 
plt.show() 
Verwandte Themen