2016-12-04 2 views
1

Ich habe den folgenden Code eines gestapelten Histogramms und es funktioniert einwandfrei, wenn FIELD numerisch ist. Wenn ich jedoch FIELD_str anstelle von 1, 2, 3, ... abc1, abc2, abc3 usw. setze, schlägt es mit dem Fehler TypeError: cannot concatenate 'str' and 'float' objects fehl.Gestapeltes Histogramm schlägt für Zeichenfolgenwerte in X-Achse fehl

filter = df["CLUSTER"] == 1 
plt.ylabel("Absolute frequency") 
plt.hist([df["FIELD"][filter],df["FIELD"][~filter]],stacked=True, 
      color=['#8A2BE2', '#EE3B3B'], label=['1','0']) 
plt.legend() 
plt.show() 

DATASET:

s_field1 = pd.Series(["5","5","5","8","8","9","10"]) 
s_field1_str = pd.Series(["abc1","abc1","abc1","abc2","abc2","abc3","abc4"]) 
s_cluster = pd.Series(["1","1","0","1","0","1","0"]) 

df = pd.concat([s_field1, s_field1_str, s_cluster], axis=1) 
df 

EDIT Wie kann ich mit ihren String-Werten (dies für die bessere Lesbarkeit des Diagramms erforderlich) (direkt oder indirekt) die Zahlen in der X-Achse ersetzen:

ich habe versucht, ein Wörterbuch zu erstellen, aber nicht herausfinden kann, wie es in dem Histogramm zu setzen:

# since python 2.7 
import collections 
yes = collections.Counter(df["FIELD_str"][filter]) 
no = collections.Counter(df["FIELD_str"][~filter]) 
+0

Es ist schwer, Ihnen zu helfen, ohne [Minimal, vollständig und prüfbare Beispiel] (http://stackoverflow.com/help/mcve) – GWW

+0

@GWW: Siehe meine Bearbeitung. – duckertito

Antwort

1

Sie müssen wahrscheinlich Barplot anstelle von Histogramm verwenden, da das Histogramm per Definition für Daten auf numerischer (Intervall-) Skala, nicht nominaler (kategorischer) Skala ist. Sie können dies versuchen:

import pandas as pd 
import matplotlib.pyplot as plt 
%matplotlib inline 

s_field1 = pd.Series(["5","5","5","8","8","9","10"]) 
s_field1_str = pd.Series(["abc1","abc1","abc1","abc2","abc2","abc3","abc4"]) 
s_cluster = pd.Series(["1","1","0","1","0","1","0"]) 

df = pd.concat([s_field1, s_field1_str, s_cluster], axis=1) 
df.columns = ['FIELD', 'FIELD_str', 'CLUSTER'] 
counts = df.groupby(['FIELD_str', 'CLUSTER']).count().unstack() 
# calculate counts by CLUSTER and FIELD_str 
counts.columns = counts.columns.get_level_values(1) 
counts.index.name = 'xaxis label here' 
ax = counts.plot.bar(stacked=True, title='Some title here') 
ax.set_ylabel("yaxis label here") 
plt.tight_layout() 
plt.savefig("stacked_barplot.png") 

stacked barplot

+0

Ihre vorherige Lösung mit 'T' funktionierte gut für mich (ansonsten sieht das Diagramm auf dem gesamten Datensatz verwildert aus):' counts.columns = counts.columns.get_level_values ​​(1) counts.T.plot.bar (stacked = True, color = ['# 8A2BE2', '# EE3B3B']) ' – duckertito

+0

Wie kann ich Titel und Xaxis-Label in diesem Fall hinzufügen? – duckertito

+0

Ich habe die Antwort bearbeitet, um Titel und Xaxis-Label hinzuzufügen. Sie können auch eine neue Achse mit normalen 'matplotlib' Aufrufen erstellen, sie nach Belieben optimieren und' pandas.plot' bitten, diese Achse mit 'ax = ...' argument zu verwenden. –