根据作业编号

时间:2016-11-23 12:34:22

标签: python python-3.x matplotlib

我想在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)
  • 第一行 - 分配1个等级
  • 第二行 - 分配2个等级

情节还必须包含:

  1. 每个给定的等级用点标记。我需要添加一个小随机 数字(在-0.1和0.1之间)到每个点的x和y坐标,到 能分辨出不同的点,否则它们将在每个点之上 其他当一个以上的学生同时获得相同的成绩时 分配
  2. 每个作业的平均成绩绘制为一行。
  3. 我已经尝试使用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()  
    

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这就是你想要的? 不确定你希望如何表示平均成绩,但我把它作为练习留给你。

修改

对于plot()的每次调用,您必须拥有相同维度的x数组和y数组。在这里,我使用enumerate()迭代数据数组,一次一行,它返回一个我称为a的索引,以及我称为grades的行。共有6行,因此a将连续取值0,1,2,3,4和5。

然后,由于您希望根据作业编号a绘制每个成绩,因此您很想做plot(a, grades)。但是,由于xy需要具有相同的维度,因此我们需要生成与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 plotplot(..., ..., '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')

enter image description here