You need to enable JavaScript to run this app. 使用NumPy、Matplotlib绘制指定区间学生成绩直方图的问题
优惠活动
大模型
产品
解决方案
定价
更多

使用NumPy、Matplotlib绘制指定区间学生成绩直方图的问题

问题定位
  • 列索引取值错位:经np.loadtxt(delimiter=';', dtype=str)读取后,每一行数据的列结构为[学生ID字符串, 成绩字符串, 空字符串](因每行末尾有多余分号,会生成一个空字符串列),列索引从0开始计数,成绩实际位于索引为1的列。原代码赋值逻辑为students = d[:,1]、grades = d[:,0],完全将成绩和学生ID的取值位置颠倒,实际传入绘图的根本不是成绩数据。
  • 数据类型未转换:读取时指定了dtype=str,因此即使是成绩数值,也以字符串格式存储,matplotlib直方图函数无法直接识别字符串类型的数值输入。
  • 绘图入参错误:原代码将整个二维数组d直接传入plt.hist(),没有提取单独的成绩序列作为绘图数据源。
  • 坐标轴标签语义颠倒:直方图默认X轴为统计维度(成绩分箱区间),Y轴为维度对应的计数(学生数量),原代码将Grades设为Y轴标签、Students设为X轴标签,逻辑完全相反。
  • 分箱边界不匹配需求:原代码设置的bins = [0, 50, 100]遵循matplotlib默认的左闭右开规则,即分箱区间为[0,50)、[50,100],恰好50分的成绩会被划入第二个区间,不符合“0-50、51-100”的分组要求。
修复步骤
  • 从数组中正确提取成绩列,通过astype(float)将字符串格式的成绩转换为数值类型。
  • 调整分箱边界为[0, 50.01, 100],保证所有≤50分的成绩归入第一个箱(对应0-50分组),≥51分的成绩归入第二个箱(对应51-100分组)。
  • 修正坐标轴标签逻辑,为分箱区间添加明确的刻度标注,匹配需求的分组命名。
完整可运行代码
import numpy as np
import matplotlib.pyplot as plt

# 保持原数据读取逻辑
data = np.loadtxt("data.dat", delimiter =';', dtype = str)
# 提取成绩列并完成类型转换
grades = data[:, 1].astype(float)
# 适配分组规则设置分箱
bins = [0, 50.01, 100]
plt.hist(grades, bins=bins, edgecolor='black')
# 修正坐标轴标签
plt.xlabel('Grades')
plt.ylabel('Number of Students')
# 为分箱区间添加匹配需求的刻度标签
plt.xticks([25, 75], ['0-50', '51-100'])
plt.show()

内容的提问来源于stack exchange,提问作者can kanaroğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 12:06:03