我正在尝试从一系列成绩中创建直方图。所有等级都是可能的7级(-3,0,2,4,7,10,12)之一。
我使用下面的代码来生成绘图,但是我无法确定将x轴标签放在条形中间的方法,删除绘图中间的空间并可能在两者之间放置一个小空间酒吧......
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()
答案 0 :(得分:3)
人们需要明白,数字不能位于条形图的中间,因为它们恰好位于应该位于的位置。 (如果你把0设为-3接近-3,那么数学之神就会开始哭泣。)
所以你要求的是分类值的直方图,而不是数字值。有一些与分类直方图有关的问题,参见例如,
您需要做的是将成绩-3
,0
,2
等视为类别(例如red
,green
, yellow
)问题是现在每个类别在列表finalGrades
中的表示频率。由于matplotlib.hist
仅了解数字数据,我们会将n
类别映射到第一个n
整数,-3 -> 0
,0 -> 1
,2 -> 2
等等等等。
现在而不是成绩列表
[-3, -3, 10, 2, 10, 0, ...]
我们有一个类别编号列表
[0, 0, 5, 2, 5, 1, ...]
并且那些类别编号是等间隔的,这样直方图将理解我们想要的东西。
然后可以用bins = [0,1,2, ... , 6,7]
绘制直方图(我们需要8个bin边缘以获得7个bin)。最后,有趣的是,align='left'
使得箱子以刻度线为中心。
然后将标记设置为分类值,即可能的等级。
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()