绘制单学生成绩

每次考试后家长会上,班主任都需要向同学们出具成绩单。
本次任务我们绘制图表,让成绩能更直观的进行呈现。

通过循环将某班所有学生的图一次绘制出。

目标图

张金涛.png

准备工作

  1. 准备好数据库
  2. 数据库中存在相应数据(看之前内容)
  3. 需要在原先代码上进行修改

步骤一:复制并修改原先代码

# 引入部分都要
import numpy as np
# ......


# 连接数据库部分需要,不变
def get_database_connection():
    # ......

# 查询获取数据、清洗数据部分需要,不变
def get_student_scores():
    # ......

# 需要修改
def draw_kde(nj, bj,class_name):
    # ......

# 这里没变
question = select("选择分析的班级:", choices=["23401", "23402", "23403"])
choice_class = question.ask()
print("您选择的班级是:", choice_class)
df = get_student_scores()
mid_chinese=df[['class','name','mid_term_chinese']]
mid_chinese_class=mid_chinese[mid_chinese['class']==choice_class]

# 以下要变
# draw_kde(mid_chinese, mid_chinese_23401,choice_class)

步骤二: 获取班级学生

以上的代码获取到了班级的数据,接下来我们需要获取到学生名单,学生数据。

学生名单

print(mid_chinese_class['name'].values)

学生成绩数据

print(mid_chinese_class['mid_term_chinese'].values)

以上两个即能获取到需要的数据

步骤三: 修改draw_kde 函数

def draw_kde(bj,class_name,stu_name,stu_val):
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.figure(figsize=(8, 6))

    plt.xlabel('期中语文成绩')
    plt.ylabel('密度')
    plt.title('期中语文成绩分布图')
    plt.xlim(0,100) 


    # 年级分布图 不需要了
    #sns.kdeplot(
    #    data=nj,
    #    x="mid_term_chinese",
    #    label="语文期中考试成绩" ,
    #    color="blue",
    #)

    # 需要的!
    sns.kdeplot(
        data=bj,
        x="mid_term_chinese",
        label=class_name+"班语文期中考试成绩",  # 设置图例标签
        color='red',
        linestyle="--",  # 虚线
        alpha=0.5,
    )
    # 年级毛毯图 不需要了
    #sns.rugplot(
    #    data=nj,
    #    x="mid_term_chinese",
    #    height=0.05,  # 控制 rug plot 的高度
    #    color="blue",
    #)

    sns.rugplot(
        data=bj,
        x="mid_term_chinese",
        height=0.08,  # 控制 rug plot 的高度
        color="red",
        alpha=0.5, 
    )
    #年级平均不需要了
    # nj_mean=nj['mid_term_chinese'].mean()
    bj_mean=bj['mid_term_chinese'].mean()

    #年级平均不需要了
    # plt.axvline(nj_mean, color="blue",linestyle=":")
    #plt.text(nj_mean+2,0.022, '年级语文平均成绩:%.1f' %(nj_mean),color="blue",)

    plt.axvline(bj_mean, color="red",linestyle=":")
    plt.text(bj_mean+3,0.024, '23401语文平均成绩:%.1f' %(bj_mean),color="red",)

    # 以下是绘制学生个人
    plt.axvline(stu_val, color="blue",linestyle=":")
    plt.text(stu_val+2,0.022, stu_name+'语文成绩:%.1f' %(stu_val),color="blue",)




    plt.grid(True)
  
    #  保存
    plt.savefig(name_list[i]+'.png')
    # !!! 绘制的图多,画完必须关掉,否则会崩
    plt.close('all')

步骤四: 主程序中通过循环绘制学生图

for i in range(0,len(name_list)):
    draw_kde(bj,choice_class,name_list[i],val_list[i])