Matplotlib-Xticks werden nicht mit Histogramm angezeigt
Ich bin generieren einige Histogramme mit matplotlib und ich habe einige Schwierigkeiten, herauszufinden, wie man die xticks einer Histogramm-Angleichung an den bars.
Hier ist ein Beispiel für den code, ich benutze zum generieren der Histogramm:
from matplotlib import pyplot as py
py.hist(histogram_data, 49, alpha=0.75)
py.title(column_name)
py.xticks(range(49))
py.show()
Ich weiß, dass alle Werte in der histogram_data
array sind in [0,1,...,48]
. Das, vorausgesetzt, ich habe die Mathematik Recht, d.h. es sind 49 eindeutige Werte. Ich möchte ein Histogramm jeder dieser Werte. Hier ist ein Bild, von dem was erzeugt ist.
Wie kann ich das Diagramm so, dass alle die xticks sind, ausgerichtet an der linken, mittleren oder rechten der einzelnen bars?
InformationsquelleAutor der Frage Paymahn Moghadasian | 2014-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: Verwenden
plt.hist(data, bins=range(50))
statt um Links ausgerichtet Ablagenplt.hist(data, bins=np.arange(50)-0.5)
zu bekommen zentriert Ablagen, etc.Auch, wenn es um performance geht, weil Sie wollen, Grafen von eindeutigen zahlen, es gibt ein paar etwas effizienter Methoden (
np.bincount
) , zeige ich am Ende.Problem Statement
Als stand-alone-Beispiel von, was Sie sehen, sollten Sie Folgendes beachten:
Als Sie bemerkt habe, die Behälter sind nicht ausgerichtet mit ganzzahligen Abständen. Dies ist im Grunde, weil Sie gebeten, für 10 Behälter zwischen 0 und 9, was nicht ganz das gleiche wie zu Fragen, für Plätze, für die 10 einzigartige Werte.
Die Anzahl der Plätze, die Sie wollen, ist nicht genau die gleiche wie die Anzahl der eindeutigen Werte. Was Sie eigentlich tun sollten, ist in diesem Fall, geben Sie manuell die bin-Kanten.
Zu erklären, was Los ist, können wir überspringen
matplotlib.pyplot.hist
und verwenden nur die zugrunde liegendennumpy.histogram
Funktion.Zum Beispiel, sagen wir, Sie haben die Werte
[0, 1, 2, 3]
. Ihr Erster Instinkt wäre zu tun:Dem ersten array zurückgegeben wird, der zählt, und das zweite ist das bin-Kanten (in anderen Worten, wo die bar Kanten würden in Ihrem plot).
Beachten Sie, dass wir Holen den Grafen, dass wir erwarten würden, sondern weil wir uns gefragt, für 4 Behälter zwischen min-und max-Daten, bin-Kanten nicht auf ganzzahlige Werte.
Nächsten, die Sie versuchen könnten:
Beachten Sie, dass die bin-Kanten (der zweiten Reihe) sind das, was Sie erwartet hatten, aber der zählt nicht. Das ist, weil die Letzte bin anders verhält als die anderen, wie bereits in der Dokumentation für
numpy.histogram
:Daher, was Sie eigentlich tun sollten, ist genau anzugeben, welche Kanten bin, die Sie wollen, und Sie entweder ein jenseits Ihr letzter Datenpunkt-oder Umschalt-bin-Kanten an den
0.5
Abständen. Zum Beispiel:Bin Angleichung
Nun wenden Sie diese auf das erste Beispiel und sehen, wie es aussieht:
Okay, Super! Allerdings haben wir jetzt effektiv haben Linksbündig bins. Was, wenn wir wollten zentriert Mülltonnen, um besser widerspiegeln die Tatsache, dass diese eindeutige Werte?
Der schnelle Weg ist, einfach mit shift-bin-Kanten:
Gleichermaßen für rechts-ausgerichtet Ablagen, die einfach verschoben werden, indem
-1
.Ein weiterer Ansatz
Für den besonderen Fall der eindeutige integer-Werte, gibt es eine andere, effizientere Ansatz, den wir nehmen können.
Wenn man sich mit eindeutigen integer zählt, beginnend bei 0, du bist besser dran mit
numpy.bincount
als mitnumpy.hist
.Beispiel:
Es gibt zwei große Vorteile dieses Ansatzes. Ist die Geschwindigkeit.
numpy.histogram
(und daherplt.hist
) im Grunde läuft die Daten übernumpy.digitize
und dannnumpy.bincount
. Denn Sie beschäftigen sich mit der eindeutige integer-Werte, es gibt keine Notwendigkeit, nehmen Sie dienumpy.digitize
Schritt.Aber der größere Vorteil ist mehr Kontrolle über die Anzeige. Wenn Sie lieber dünnere Rechtecke, verwenden Sie einfach eine kleinere Breite:
InformationsquelleAutor der Antwort Joe Kington
Verwendung der OO-Schnittstelle zu konfigurieren Zecken hat den Vorteil der Zentrierung der Etiketten, während die Erhaltung der xticks. Auch, es funktioniert mit jedem Plotten der Funktion und hängt nicht von
np.bincount()
oderax.bar()
InformationsquelleAutor der Antwort int