2017-12-19 1 views
1

Die Daten im Dataset bestehen ausschließlich aus Zeichen. Zum Beispiel:Plotten eines Pandas DataFrame von Char-Daten mit matplotlib

p,x,s,n,t,p,f,c,n,k,e,e,s,s,w,w,p,w,o,p,k,s,u 
e,x,s,y,t,a,f,c,b,k,e,c,s,s,w,w,p,w,o,p,n,n,g 
e,b,s,w,t,l,f,c,b,n,e,c,s,s,w,w,p,w,o,p,n,n,m 
p,x,y,w,t,p,f,c,n,n,e,e,s,s,w,w,p,w,o,p,k,s,u 
e,x,s,g,f,n,f,w,b,k,t,e,s,s,w,w,p,w,o,e,n,a,g 

Eine vollständige Kopie der Daten kann in agaricus-lepiota.data in the uci machine learning datasets mushroom dataset

Gibt es Methoden der Visualisierung für die Verwendung von char-Daten (anstatt konvertieren die Daten auf numerisch) über matplotlib gefunden werden?

Nur für jede Art von Visualisierungen heißt:

filename = 'mushrooms.csv' 
df_mushrooms = pd.read_csv(filename, names = ["Classes", "Cap-Shape", "Cap-Surface", "Cap-Colour", "Bruises", "Odor", "Gill-Attachment", "Gill-Spacing", "Gill-Size", "Gill-Colour", "Stalk-Shape", "Stalk-Root", "Stalk-Surface-Above-Ring", "Stalk-Surface-Below-Ring", "Stalk-Colour-Above-Ring", "Stalk-Colour-Below-Ring", "Veil-Type", "Veil-Colour", "Ring-Number", "Ring-Type", "Spore-Print-Colour", "Population", "Habitat"]) 


#If there are any entires (rows) with any missing values/NaN's drop the row. 
df_mushrooms.dropna(axis = 0, how = 'any', inplace = True) 

df_mushrooms.plot.scatter(x = 'Classes', y = 'Cap-Shape') 
+0

Ich glaube nicht. Es ist eine große Frage, was die Charaktere darstellen. Glücklicherweise ist die Konvertierung zu Zahlen einfach. –

+0

Es gibt eine 'pd.factorize' Methode, die Sie verwenden können. Alternativ können Sie auch in kategorisch konvertieren. –

+0

Im Prinzip können Sie etwas wie 'plt.scatter (["e", "w", "a", "e"], ["z", "t", "z", "u"]) '' tun . Ich bin mir nicht sicher, ob Sie danach suchen, zumal im Fall von Pilzen, was wäre die Information, die eine solche Handlung vermittelt? Möchtest du nicht lieber wissen, wie viele braune Pilze essbar sind oder wo die Menge von Interesse ist? Eine Streuung würde nur einen Punkt zeigen, egal wie oft diese Kombination in den Daten ist. – ImportanceOfBeingErnest

Antwort

1

Es ist möglich, dies zu tun, aber mit diesem Ansatz ist es nicht wirklich einen Sinn aus einer grafischen Sicht machen. Wenn Sie sind zu tun, was Sie gefragt, denn es würde wie folgt aussehen:

enter image description here

Und ich weiß, dass ich nicht in das Gebiet sagen, jemand treten sollte, wie sie ihre Graphen präsentieren, aber dies nicht ersichtlich irgendwelche Informationen zu mir. Das Problem ist, dass die Verwendung von Classes und Cap-Shape Felder für Ihre x und y Indizes immer den gleichen Buchstaben an der gleichen Stelle setzen wird. Es gibt keine Variabilität. Vielleicht gibt es ein anderes Feld, das Sie als Index verwenden könnten, und dann verwenden Sie die Cap-Shape als Ihren Marker, aber da dies ist, fügt dies keinen Wert hinzu. Auch das ist für mich persönlich.

Um eine Zeichenkette als Markierung zu verwenden, können Sie die Markierung "$ ... $" verwenden, die in matplotlib.markers beschrieben wird, aber wieder muss ich den Vorbehalt, dass die grafische Darstellung viel langsamer als die traditionelle Methode ist, wie Sie durchlaufen müssen die Zeilen Ihres Datenrahmens.

fig, ax = plt.subplots() 
# Classes only has 'p' and 'e' as unique values so we will map them as 1 and 2 on the index 
df['Class_Id'] = df.Classes.map(lambda x: 1 if x == 'p' else 2) 
df['Cap_Val'] = df['Cap-Shape'].map(lambda x: ord(x) - 96) 
for idx, row in df.iterrows(): 
    ax.scatter(x=row.Class_Id, y=row.Cap_Val, marker=r"$ {} $".format(row['Cap-Shape']), c=plt.cm.nipy_spectral(row.Cap_Val/26)) 
ax.set_xticks([0,1,2,3]) 
ax.set_xticklabels(['', 'p', 'e', '']) 
ax.set_yticklabels(['', 'e', 'j', 'o', 't', 'y']) 
fig.show() 
Verwandte Themen