You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让柱状图展示含零值变量?Python学生成绩可视化问题

解决方法:让柱状图显示全部A-F成绩等级

你的代码里用collections.Counter(grade)统计等级频率时,只会保留有学生获得的等级。要显示全部A-F等级,需要先定义完整的等级列表,再为每个等级补全计数(无学生的等级计数设为0)。

修改步骤

  1. 在summarize_test_scores函数中,定义完整的成绩等级列表:
all_grades = ['A', 'B', 'C', 'D', 'F']
  1. 替换原有的频率统计逻辑,确保每个等级都有对应的计数:
grades_freq = collections.Counter(grade)
# 遍历完整等级列表,获取每个等级的计数,不存在则返回0
grade_counts = [grades_freq.get(g, 0) for g in all_grades]
  1. 绘制柱状图时,使用补全后的计数和完整等级列表:
axes = sns.barplot(x=grade_counts, y=all_grades, palette='bright')

修改后的完整代码

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import random
import seaborn as sns
import collections

def input_test_scores():
    #input for number of students
    studentnumber=int(input('Enter number of students'))
    #input for number of tests per student
    numberoftests=int(input('enter number of tests per student'))
    #empty list to store scores
    score=[]
        
    for i in range(studentnumber):
        #empty list for each students name and scores
        studentlist=[]
 
        for j in range(numberoftests):
            #input for test score
            print("Enter score for test ", j+1, ":")
            #add students score to their list
            studentlist.append(int(input()))
        #add student list to score list to create a 2d list
        score.append(studentlist)
                 
    return score


def summarize_test_scores(score):
     
    A=0
    B=0
    C=0
    D=0
    F=0
    gradelist=[A,B,C,D,F]
    mean=[]
    for data in score:
        m=sum(data)/len(data)
        mean.append(m)
    
    grade=[]
    for x in mean:
        if x >=90:
            grade.append('A')
            A+=1
        
        elif x >=80:
            B+=1
            grade.append('B')
        elif x >=70:
            C+=1
            grade.append('C')
        elif x >=60:
            D+=1
            grade.append('D')
        else:
            F+=1
            grade.append('F')
        
    print("MEAN  GRADE")
    for i in range(len(score)):
        print(f'{mean[i]:.2f}  {grade[i]} ')
    
    title = f'Student Grades'
    # 定义完整的成绩等级列表
    all_grades = ['A', 'B', 'C', 'D', 'F']
    grades_freq = collections.Counter(grade)
    # 补全每个等级的计数,无学生的等级设为0
    grade_counts = [grades_freq.get(g, 0) for g in all_grades]
    
    sns.set_style('whitegrid')
    axes = sns.barplot(x=grade_counts, y=all_grades, palette='bright')
    axes.set(xlabel='Students', ylabel='Grades') 
    axes.set_title(title)


score=input_test_scores ()
summarize_test_scores(score)

修改后,无论是否有学生获得某个等级,柱状图都会完整显示A-F所有字母,对应计数为0的等级会显示高度为0的柱子。

内容的提问来源于stack exchange,提问作者gia blum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:55:20