我想用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()
发布于 2016-11-23 13:12:44
如果我明白你的问题,这就是你想要的吗?不知道你想如何表达平均成绩,但我把它作为一项练习留给你。
编辑
对于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)
之间添加了一个随机数,使用公式(jitter_max-jitter_min)*np.random.random(size=len(grades))+jitter_min
(np.random.random()
)。
要绘制平均值,只需逐行计算平均值,将该值存储在数组中,然后根据包含赋值号(0、1、2、3、.)的相同维数组绘制该数组。要将其绘制为一行,而不是简单的点,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')
https://stackoverflow.com/questions/40764723
复制相似问题