把数据画成图:ECharts / matplotlib
把一组真数据画成会说话的图——顺便学会识破图表怎么撒谎。
学习证据 学完后,怎么核对?
把学习结果留在一个可以回看、可以复做的动作里;这一区只写学生能自己检查的证据。
如何核对
- 可复现的数据或创意产物
- 数据、参数与输出核对
适用边界
用于小规模教学数据与创意原型;结论受数据质量、参数、隐私和运行环境限制。
最后复核
这是内容复核日期,不是学习截止日期。
讲
例子一点一分的差距,画成两倍的碾压
班会投影上一张柱状图:「B 班平均分远超 A 班」——一根柱子是另一根的两倍多高。小晴凑近看了眼坐标轴,笑了:A 班 89.1,B 班 90.2,差 1.1 分;柱子悬殊,是因为 y 轴不从 0 起,从 88 起。同一组数据、两种画法,下面当场重演——注意两张图的数字标签一模一样:
初中站回看:把数据画成图 —— 那时学的是「数字排成表是让人算的,画成图是让人一眼看懂的」;现在上真工具画真数据,还要补上另一半:一眼看懂的图,也能一眼骗人。诚实版:y 轴从 0 起——1.1 分的差距,看起来就是 1.1 分。
截断版:同一组数据,y 轴从 88 起——差距被放大成「碾压」。两张图都随右上角主题变色,数字始终是 89.1 和 90.2:数字没撒谎,标尺在撒谎。
名词两件画图工具,按图住在哪里选:ECharts=网页里的图表库(vendored 单文件即可用,中文文档;上面两张图和本站的图表就是它画的);matplotlib=Python 世界的画图库,住在上一课的 Jupyter 里,算完一格顺手画一格。
定义画图三步:数据 → 选形状 → 定标尺
① 把数据准备成列表;② 形状由问题决定——先说清「我要读者比什么」,再挑图形;③ 诚实由标尺决定——y 轴从哪起、x 轴取哪段区间。前两步决定图说不说得清,第三步决定图说不说得对:
第三步最不起眼,却握着整张图的公信力。
| 你想让读者看什么 | 用什么形状 |
|---|---|
| 比较几个量的大小 | 柱状图 |
| 一个量随时间的走势 | 折线图 |
| 部分占整体的比例 | 饼图(超过五块就改用柱状) |
| 两个量有没有关系 | 散点图 |
看图先看轴——图表撒谎的两大惯用手法全在标尺上:① 截断坐标轴:y 轴不从 0 起,小差距画成大悬殊(上面第二张图);② 掐头去尾选区间:一条起起伏伏的曲线,只截取上涨的那一段,跌的月份不给你看。两招的共同点:数据全是真的,谎全在取景框上。
上手比想象容易。同一张诚实的柱状图,两个世界的写法——注意两段代码里都有那行「从 0 起」:
// 网页里:ECharts
var chart = echarts.init(document.getElementById('mychart'));
chart.setOption({
xAxis: { type: 'category', data: ['A 班', 'B 班'] },
yAxis: { type: 'value', min: 0 }, // 诚实的 y 轴,从 0 起
series: [{ type: 'bar', data: [89.1, 90.2] }]
});
# Jupyter 里:matplotlib import matplotlib.pyplot as plt plt.bar(['A 班', 'B 班'], [89.1, 90.2]) plt.ylim(0, 100) # 诚实的 y 轴,从 0 起 plt.show()
泛化换个角度:图是论证,轴是前提
一张图就是一段论证:数据是证据,形状是推理,标尺是前提——前提被动了手脚,证据再真、推理再顺,结论也不算数(1.2 的图尔敏在这里换了身衣服)。所以拿到任何图,三连问练成条件反射:轴从哪起?区间取多长?数据谁给的?这不只是防别人——下面例三你会看到,最容易被截断轴骗到的,常常是做图的人自己。
例
补充三例——两个常见用法,一个易错。
朵朵把上一课算出的「一周自习时长」搬进自己的页面,任务单交给编程智能体:「用 vendored 的 ECharts 画柱状图;约束:y 轴 min 写 0、颜色取页面 CSS 变量、数值标在柱顶;验收:换主题图跟着变色、本地 HTTP 预览可用、断网后不请求外部资源。」一稿过。2.2c 图解任务单怎么写,图表原样适用——图表也是图解,约束里多一条「标尺诚实」而已。
阿哲刷到一张「某学习法走红后,使用者成绩持续上涨」的折线图,x 轴只有 3 月到 5 月。他多问了一句「区间拉长呢」,翻出原始数据:这条线年年 3 到 5 月都涨——那是每学期的复习季,跟学习法没关系。区间换了,故事就换了:趋势结论要看整段曲线,不能只看别人裁给你的那一段——这正是三连问里「区间取多长」的用法。
大鹏给班会做「同学日均手机使用」图:5.4 和 6.1 小时两根柱子,画出来「不够醒目」,他顺手把 y 轴改成从 5 起——全班哗然的效果有了,可数学课代表当场指出坐标轴动过手脚,后面连他的数据本身也没人信了。错在哪:他没打算骗人,只是想「效果好一点」——截断轴多数时候就是这么发生的。修法:默认从 0 起;差距真的小、又必须放大细看时,明确标注「y 轴从 5 起」并把数值标在柱顶——把取景框亮给读者,公信力才守得住。
做
新闻配图「本市空气质量大幅改善」,折线图只画了今年 2 月到 4 月,一路向好。你的第一反应该是?
- 从上一课的笔记本里挑一组自己的汇总数据或虚构数据(或重新记一组,七个数以上),不带姓名、联系方式或他人记录。
- 诚实版:在 Jupyter 里用 matplotlib(或让智能体在你页面里用 ECharts)画出来——形状按「想让读者比什么」选,y 轴从 0 起、数值标上。
- 撒谎版:同一组数据故意画一张骗人的——截断 y 轴或只截一段区间,配一句你想诱导的结论。
- 两图并排,向同学说出撒谎版动了哪把标尺、观感差了多少;git 拍快照。
怎么算过关:两张图同数据不同观感;你能一句话说出谎点在哪根轴上;同学看完诚实版能准确复述真实差距。亲手造过一次假,以后一眼就能认出它。
卡
图表撒谎的两大惯用手法是什么?拿到一张图,先问哪三连问?
截断坐标轴(小差距画成大悬殊)、掐头去尾选区间(只给你看涨的那段)。三连问:轴从哪起?区间取多长?数据谁给的?——数字可以全真,谎藏在取景框里。
- 形状由问题决定:比较柱、趋势线、占比饼、关系散点。
- 诚实由标尺决定:看图先看轴——轴从哪起、区间多长。
- 最容易被截断轴骗到的是做图的人自己——「想醒目一点」就是谎的起点。