2016-11-09 4 views
0

Ich versuche ein Histogramm aus einer Reihe von Noten zu erstellen. Alle Noten sind eine der möglichen 7-Skala (-3, 0, 2, 4, 7, 10, 12).Plotten in Python3 (Histogramm)

Ich verwende den folgenden Code, um das Diagramm zu generieren, aber ich kann einen Weg nicht identifizieren, um die X-Achsenbeschriftung in der Mitte der Balken zu platzieren, entfernen Sie den Platz in der Mitte des Diagramms und vielleicht einen kleinen Platz zwischen den Bars ...

import matplotlib.pyplot as plt 
finalGrades = [-3, -3, 10, 2, 10, 0, 7, 7, 12, -3, 7, 0, 12, 12, 12 ,12, 12, 0, 0, 0, 4] 
plt.hist(finalGrades, bins=8) 
plt.xticks([-3, 0, 2, 4, 7, 10, 12]) 
plt.title("Final Grades plot") 
plt.xlabel("All possible grades") 
plt.ylabel("Number of students") 
plt.show() 

enter image description here

+2

Die Handlung ist richtig. Es zeigt 8 gleichmäßig verteilte Bins zwischen -3 und 12. Die x-Labels sind genau so festgelegt, wie Sie es codiert haben. Sie müssen also möglicherweise besser erklären, was Sie erreichen möchten. Wollen Sie ungleich verteilte Behälter oder benennen Sie die Behälter einfach mit einer willkürlich gewählten Nummer? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Ich würde auf der X-Achse die Zahlen in der Mitte des Balkens anzeigen - wie ich in der Abbildung unten (* sorry, in paint! *) Redigiert habe: [link] (http: // imgur. com/a/pSjS4) – Silverthorn

Antwort

2

Man muss verstehen, dass die Zahlen nicht in der Mitte der Bar sein können, da sie genau diese Positionen sind, wo sie sein sollten. (Wenn Sie 0 so nahe wie -3 als 2 setzen, fangen die Götter der Mathematik an zu weinen.)

Also, was Sie hier fragen, ist ein Histogramm von kategorialen Werte, keine numerischen. Es gibt einige Fragen, die sich bereits auf kategoriale Histogramme beziehen, siehe z.

Was Sie tun müssen, ist die Note zu denken -3, 0, 2 usw. als Kategorie (wie red, green, yellow) und die Frage ist, jetzt, wie oft jede Kategorie in der Liste finalGrades vertreten ist. Da matplotlib.hist nur numerische Daten versteht, würden wir die n Kategorien zu den ersten n ganzen Zahlen, -3 -> 0, 0 -> 1, 2 -> 2 und so weiter zuordnen.
nun statt einer Liste von Noten
[-3, -3, 10, 2, 10, 0, ...]
wir eine Liste von Kategorienummern haben
[0, 0, 5, 2, 5, 1, ...]
und diese Kategorienummern sind mit gleichem Abstand, so dass das Histogramm werden verstehen, was wir wollen. Das Histogramm kann dann mit bins = [0,1,2, ... , 6,7] geplottet werden (wir benötigen 8 Bin-Kanten, um 7 Bins zu erhalten). Schließlich, und komischerweise, align='left' macht die Bins zentriert bei den Tickmarks. Die Tickmarks werden dann als kategoriale Werte gesetzt, d. H. Die möglichen Grade.

import matplotlib.pyplot as plt 

finalGrades = [-3, -3, 10, 2, 10, 0, 7, 7, 12, -3, 7, 0, 12, 12, 12 ,12, 12, 0, 0, 0, 4] 
possibleGrades = [-3, 0, 2, 4, 7, 10, 12] 
fin = [ possibleGrades.index(i) for i in finalGrades] 
plt.hist(fin, bins=range(8), align="left") 
plt.xticks(range(7), possibleGrades) 

plt.title("Final Grades plot") 
plt.xlabel("All possible grades") 
plt.ylabel("Number of students") 
plt.show() 

enter image description here

Verwandte Themen