22.4月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])
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 现代职校董良
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果