3 Stimmen

Plotten von gestapelten Histogrammen in Python mit Matplotlib

Ich versuche, einige Daten effektiv zu plotten, damit ich sie visualisieren kann, aber ich habe einige Schwierigkeiten. Ich habe zwei Werte. Einer davon ist diskret (0 oder 1) und heißt label. Der andere ist ein kontinuierlicher Wert irgendwo zwischen 0 und 1. Ich möchte ein Histogramm erstellen, bei dem auf der X-Achse zahlreiche Balken wären, zum Beispiel einer für jede .25 der Daten, also vier Balken, wobei der erste den Wert von 0-0.25 hat, der zweite 0.25-0.5, der dritte 0.5-0.75 und der vierte 0.75-1.

Die y-Achse wird dann je nachdem, ob das Label eine 1 oder eine 0 ist, aufgeteilt, sodass wir ein Diagramm wie dieses erhalten:

Bitte entschuldigen Sie das schlechte Paint-Bild!

Wenn es effektive, intelligente Möglichkeiten gibt, meine Daten aufzuteilen (statt nur vier Balken für diese Werte fest einzuprogrammieren), wäre ich auch daran interessiert, obwohl das wahrscheinlich eine weitere Frage rechtfertigt. Ich werde sie posten, wenn ich den Code dafür habe.

Ich habe beide Werte in numpy-Arrays gespeichert, wie folgt, bin mir aber unsicher, wie ich solche Diagramme plotten kann:

import numpy as np
import pylab as P

variable_values = trainData.get_vector('variable') # gibt ein eindimensionales numpy-Array von Werten zurück
label_values = trainData.get_vector('label')
x = alchemy_category_score_values[alchemy_category_score_values != '?'].astype(float) # Entfernen von leeren Werten
y = label_values[alchemy_category_score_values != '?'].astype(float)

fig = plt.figure()

plt.title("Histogramm der Merkmalsaufschlüsselung")
plt.xlabel("Variable")
plt.xlim(0, 1)
plt.ylabel("Label")
plt.ylim(0, 1)
xvals = np.linspace(0,1,.02)

plt.show()

Tutorial zu matplotlib zeigt den folgenden Code, um grob zu erreichen, was ich möchte, aber ich verstehe nicht wirklich, wie es funktioniert (LINK):

P.figure()

n, bins, patches = P.hist(x, 10, normed=1, histtype='bar', stacked=True)

P.show()

Jede Hilfe wird sehr geschätzt. Danke.

Bearbeiten:

Ich erhalte jetzt den Fehler:

AssertionError: unverträglichen Größen: Das Argument 'height' muss die Länge 5 oder Skalar haben

Ich habe meine beiden numpy-Arrays ausgegeben und sie sind gleich lang, eins ist diskret, das andere kontinuierlich. Hier ist der Code, den ich ausführe:

x = variable_values[variable_values != '?'].astype(float)
y = label_values[label_values != '?'].astype(float)

print x # Ausgabe der numpy-Arrays gleicher Größe, x ist kontinuierlich, y diskret. Beide jetzt vom Typ float.
print y

N = 5
ind = np.arange(N)    # die x-Positionen für die Gruppen
width = 0.45       # die Breite der Balken: kann auch eine Sequenz der Länge der x-Werte sein

p1 = plt.bar(ind, y,   width, color='r') # hier tritt der Fehler auf
p2 = plt.bar(ind, x, width, color='y',
             bottom=x)

plt.ylabel('Punktzahlen')
plt.title('Punktzahlen nach Gruppe und Geschlecht')
plt.xticks(ind+width/2., ('G1', 'G2', 'G3', 'G4', 'G5') )
plt.yticks(np.arange(0,81,10))
plt.legend( (p1[0], p2[0]), ('Männer', 'Frauen') )

plt.show()

2voto

logc Punkte 3633

Ich denke, dass dieses andere Tutorial aus der gleichen Matplotlib-Galerie für dich viel aufschlussreicher sein wird ...

Beachten Sie, dass die zweite Datenserie ein zusätzliches Argument im Aufruf hat: bottom

p1 = plt.bar(ind, x, width, color='r', yerr=womenStd)
p2 = plt.bar(ind, y, width, color='y',
             bottom=x, yerr=menStd)

Ersetzen Sie einfach menMeans durch x und womenMeans durch y.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X