为什么讲这个知识点孩子学完列表、循环、求和之后最容易卡在这些数字到底能干什么。成绩分布图是个很好的落点数据是孩子自己班里的图是孩子自己画的结论也是孩子自己读出来的。比起直接讲统计学定义先让孩子看到一堆数字变成一张图图上有形状、有疏密、有偏斜他们才会去问为什么这块柱子高为什么那边几乎是空的会问问题数据思维就起步了。完整代码importmatplotlib.pyplotasplt# 一个班 40 人的数学成绩scores[92,85,78,66,95,88,73,59,81,90,77,84,69,98,62,75,87,91,55,80,72,86,93,68,79,83,47,89,74,96,61,82,70,76,94,65,88,71,100,58,]# 让中文标题和标签能正常显示plt.rcParams[font.sans-serif][SimHei,Microsoft YaHei,Arial Unicode MS]plt.rcParams[axes.unicode_minus]Falsefig,axplt.subplots(figsize(8,5))# bins 是每根柱子的边界0,10,20,...,100ax.hist(scores,binsrange(0,101,10),edgecolorwhite,color#5B8FF9)avgsum(scores)/len(scores)ax.axvline(avg,color#F5222D,linestyle--,linewidth1.5,labelf平均分{avg:.1f})ax.axvline(60,color#52C41A,linestyle:,linewidth1.5,label及格线 60)ax.set_title(数学成绩分布图)ax.set_xlabel(分数段)ax.set_ylabel(人数)ax.set_xticks(range(0,101,10))ax.legend()plt.tight_layout()plt.savefig(score_distribution.png,dpi120)plt.show()# 顺便把几个关键数字算出来和图形对照着看passed[sforsinscoresifs60]print(f人数{len(scores)})print(f平均分{avg:.1f})print(f最高分{max(scores)}最低分{min(scores)})print(f及格率{len(passed)/len(scores):.1%})跑出来的图里横轴是 0 到 100 的分数段纵轴是落在该段的人数红色虚线是平均分绿色点线是及格线。代码要点拆解binsrange(0, 101, 10)是整段代码里最值得讲的一行。bins给的是分组的边界不是组数。range(0, 101, 10)得到 0、10、20……100 共 11 个边界正好切出 10 段。如果只写bins10matplotlib 会按数据的最小值和最大值自动切分段宽就不是 10 分了横轴会变成 47 到 100读起来很别扭。ax.hist和plt.hist的区别。用fig, ax plt.subplots()之后统一用ax.xxx可以让标题、轴标签、参考线都落在同一张图里。混着用前面ax.hist后面plt.title在小脚本里也能跑但一旦要画两张子图就会串到别的图上。参考线用axvline。它画的是竖线x 固定axhline才是横线。ymin/ymax默认 0 到 1是相对坐标所以线会自动贯穿整个图高不用手动调。savefig要写在show前面。plt.show()之后画布在某些后端会被清空保存出来就是一张白图。这个坑很隐蔽因为程序不报错。读图的入口。图不是用来看好看的而是用来提问