我想在Python3中绘制一个图表,它将显示x轴上的分配和y轴上的等级。 x轴必须显示从1到M的所有赋值,y轴必须显示所有3到12的等级。
输入是M分配的等级矩阵:例如对于6个作业我有以下输入:
array([[10, -3, 10, ..., 7, 0, 12],
[12, 12, 12, ..., 10, 0, 12],
[7, 7, 10, ..., 10, 0, 10],
[7, 4, 7, ..., 7, 0, 12],
[-3, 4, 7, ..., 4, 4, 12],
[7, 4, 4, ..., 4, 0, 12]], dtype=object)
情节还必须包含:
我已经尝试使用for循环来绘制每个作业,但它似乎不起作用 - 因此我现在卡住了。
import matplotlib.pyplot as plt
yaxis = np.arange(-3, 13)
for i in range(len(assignments)-1):
plt.plot(assignments[i, :], yaxis, label = "Assignemnt [i]")
plt.title("Grades per assignment")
plt.xlabel("Assignments")
plt.ylabel("Grades")
plt.show()
答案 0 :(得分:1)
如果我理解你的问题,这就是你想要的? 不确定你希望如何表示平均成绩,但我把它作为练习留给你。
修改强>
对于plot()
的每次调用,您必须拥有相同维度的x
数组和y
数组。在这里,我使用enumerate()
迭代数据数组,一次一行,它返回一个我称为a
的索引,以及我称为grades
的行。共有6行,因此a
将连续取值0,1,2,3,4和5。
然后,由于您希望根据作业编号a
绘制每个成绩,因此您很想做plot(a, grades)
。但是,由于x
和y
需要具有相同的维度,因此我们需要生成与grades
具有相同维度的数组,这是x = a*np.ones(len(grades))
所做的。从那里,你可以做plot(x, grades)
。但是,正如你在问题中指出的那样,相等的等级会重叠。
为避免重叠,我使用公式[-0.1, 0.1)
(see the documentation for np.random.random()
)在(jitter_max-jitter_min)*np.random.random(size=len(grades))+jitter_min
之间添加了一个随机数。
要绘制平均值,您只需逐行计算平均值,将该值存储在数组中,然后将该数组绘制为包含赋值号的相同维数组(0,1,2,3) ,...)。要将其绘制为一条线,而不仅仅是点,check outthe documentation for plot
:plot(..., ..., 'o-')
data = np.array([[10, -3, 10, 7, 0, 12],
[12, 12, 12, 10, 0, 12],
[7, 7, 10, 10, 0, 10],
[7, 4, 7, 7, 0, 12],
[-3, 4, 7, 4, 4, 12],
[7, 4, 4, 4, 0, 12]])
jitter_min = -0.1
jitter_max = 0.1
for a,grades in enumerate(data):
x = a*np.ones(len(grades)) + (jitter_max-jitter_min)*np.random.random(size=len(grades))+jitter_min
plt.plot(x, grades, 'o', label='Assignment #{:d}'.format(a), clip_on=False)
plt.xlabel('Assignments')
plt.ylabel('Grades')