如何修改Python代码实现按字母等级统计学生人数的柱状图
修正学生成绩等级柱状图显示问题
问题概况
现有代码可实现学生数量、测试次数及分数的输入,计算学生平均分并划分字母等级,但生成的柱状图不符合需求:
- 错误将字母等级置于Y轴、平均分置于X轴,无法直观展示各等级的学生人数分布
- 未包含无学生获得的字母等级(如无学生得A时,图表中不会显示A的柱子)
修正后的完整代码
%matplotlib inline import matplotlib.pyplot as plt import numpy as np import seaborn as sns def input_test_scores(): # 输入学生数量 studentnumber = int(input('Enter number of students: ')) # 输入每位学生的测试次数 numberoftests = int(input('Enter number of tests per student: ')) # 存储所有学生的分数列表 score = [] for i in range(studentnumber): # 存储单个学生的所有测试分数 studentlist = [] for j in range(numberoftests): # 输入单份测试分数 print(f"Enter score for test {j+1} of student {i+1}: ") studentlist.append(int(input())) # 将单个学生的分数加入总列表 score.append(studentlist) return score def summarize_test_scores(score): # 计算每位学生的平均分 mean = [sum(data)/len(data) for data in score] # 划分字母等级 grade = [] for x in mean: if x >= 90: grade.append('A') elif x >= 80: grade.append('B') elif x >= 70: grade.append('C') elif x >= 60: grade.append('D') else: grade.append('F') # 打印每位学生的平均分和等级 print("MEAN GRADE") for m, g in zip(mean, grade): print(f'{m:.2f} {g}') # 统计所有字母等级(含无人获得的等级)的人数 all_grades = ['A', 'B', 'C', 'D', 'F'] grade_counts = [grade.count(g) for g in all_grades] # 生成柱状图 title = f'Student Grade Distribution (Total Students: {len(grade)})' sns.set_style('whitegrid') axes = sns.barplot(x=all_grades, y=grade_counts, palette='bright') axes.set_title(title) axes.set_xlabel('Letter Grade') axes.set_ylabel('Number of Students') plt.show() score = input_test_scores() summarize_test_scores(score)
关键修改说明
- 修复原代码中函数内的缩进错误,确保绘图逻辑属于
summarize_test_scores函数 - 新增
all_grades列表定义所有可能的字母等级,通过grade.count()统计每个等级的学生人数,保证无人获得的等级也会显示(人数为0) - 调整
sns.barplot的参数:X轴设为字母等级,Y轴设为对应人数,符合需求 - 优化输入提示信息,明确是哪位学生的哪次测试
- 添加图表标题和坐标轴标签,提升可读性
内容的提问来源于stack exchange,提问作者gia blum
相关产品推荐
相关产品推荐

