本章精髓 同一份数据,画法不同,读出来的结论就不同。图不是给数据化妆,它替读图的人做了一次判断:哪个量重要、哪些拿来比、从哪儿开始看。选错图表类型、动一下坐标轴的起点,数字一个没改,结论就变了。
学完本章后,你应该能够:
- 说清柱状图、折线图与饼图各自适合回答什么问题,并为一份数据选出合适的图;
- 说清数值是怎么变成图上的长度与位置的,指出改动坐标轴起点会带来什么后果;
- 为一张图补齐标题、单位、数据范围与来源四项,并写出规模、分布、发现三句结论;
- 做出一个单文件的成果页,双击可看、断网可看,手机上也读得了;
- 先画出作品最后要给人看的那张图,再据此把期末选题砍到三个功能。
成品 · 268 292 315 · 让它做减法
先看成品的版式,再看原料,最后看一眼画歪了会是什么样。
1.1本章成品:一页纸的成果
成品是一个 .html 文件,双击打开就是一页:最上面一句结论,中间两张图,最下面一行写清数据从哪来、什么时候统计的。不联网也能看,手机上也读得了,可以直接投影。
这一页的用途很具体:期末答辩时投影出来的第一屏。做完这一页,你也就想清楚了自己的作品最后要给人看什么。
1.2这份数据长什么样
原料是一张汇总表:三个班、六个月的读书活动参与人次。一行一个月,一列一个班。
| 月份 | 数据2301 | 数据2302 | 数据2303 |
|---|---|---|---|
| 3月 | 38 | 45 | 52 |
| 4月 | 42 | 48 | 55 |
| 5月 | 51 | 53 | 58 |
| 6月 | 47 | 50 | 54 |
| 7月 | 45 | 49 | 51 |
| 8月 | 45 | 47 | 45 |
| 合计 | 268 | 292 | 315 |
这张表里其实藏着两个可以说的事实:各班之间差多少(看最后一行),逐月怎么变化(看每一列的走势)。两件事需要两种图,这就是成果页上放两张图的原因。
1.3同一组数字,两张图
下面两张图用的是同一组数字:268、292、315。一个数都没改,只把纵轴的起点从 0 抬到了 250。
柱子上标的数字完全相同,柱子的长度不同
两句话不可能都对。真实情况是:最低的班是最高的班的 85%;而在右边那张图上,最矮的柱子只有最高柱子的 28%。
打开 第15章演示_抬基线.html,拖动那根滑块,看着柱子在你眼前变形。页面上还有一个"遮住数字"的开关,先遮住只看形状问一遍,再放开数字看一遍。
1.4本章新技巧:让它帮你做减法
大模型的默认倾向是往上加。要一张图,它加渐变、阴影、圆角、入场动画;说想做个记账的,它能给你规划出会员体系和数据大屏。加出来的东西不一定难看,问题在于它们一样也不承载数据,却实实在在增加了读图和维护的成本。
所以本章两处都要用减法:一处砍图上的装饰,一处砍期末选题的功能。用法是同一个:让它扮演一个只做减法的角色,明确禁止它添加任何东西,并且要求它逐条说明"删掉之后读者会不会少知道一件事"。
1.5可直接复制的提示词
第一段里的几条要求,分别对应后面要讲的知识点:
1.6大模型的常见偏差
默认往图上加装饰。 渐变、阴影、三维、圆角、入场动画。这些一样也不增加信息,只增加读图成本,也让文件更容易出问题。"不要加渐变、阴影、三维效果、动画和背景图"这句要写全。
自动把纵轴调成好看的范围。 它会"优化"坐标范围让差距看起来更明显,出发点是让图更有冲击力,结果就是误导。柱状图从 0 起这一条必须写明,拿到代码后还要再核对一次。
引入需要联网的图表库。 这是本章最需要防的一种。用外部图表库做出来的页面在你机器上完全正常,拿到没网的场合就是一片空白,而且不报错,你在台上才发现。
Python 路线不处理中文。 它给的绘图代码默认不设中文字体,出来是一排方块。要在提示词里写明系统与可用的字体名,或者要求代码里自动从几个候选中挑一个可用的。
第15章演示_成果页.html,它的数据区就在文件最上面,改几个数字两张图立刻跟着变。走 Python 路线的用 第15章演示_出图.py,把设置区的中文字体开关关掉再跑一次,可以当场看到方块。第15章演示_抬基线.html 与 第15章演示_以终图定功能.html 是两个网页,不需要装任何东西。五个演示文件都不依赖网络。比大小 · 看变化 · 映射 · 基线
本章的核心内容集中在这一部分和下一部分。
这八个术语会原样出现在绘图库文档、报错提示与数据发布规范里。前四个在本部分讲解,后四个在第三部分讲解。
2.1四个知识点,一个一个看
选哪一种由问题决定,不由好看决定
现象:同一份数据,有人画柱状图,有人画折线图,有人画饼图。
概念:图表类型不是审美选择,取决于这张图要回答的问题。比大小用柱状图,看随时间的变化用折线图,看占比用饼图或堆叠条形。选错的代价是读者读不出你想说的那件事,或者读出另一件。
类比:装水用杯子,装米用袋子。器具选错,东西不是撒了就是拿不动。
代码里那一行除法,就是映射本身
现象:268 这个数字,在图上成了一根具体高度的柱子。
概念:画图的本质是映射(mapping):把数值换算成长度、位置或角度。柱状图用长度,折线图用位置的高低,饼图用角度。映射一旦定下来,图上每一处视觉差异都代表数值差异;反过来说,读者看到的视觉差异,会被他当成数值差异。
类比:温度计的刻度就是一次映射。水银柱多高对应多少度,是事先定死的。
规矩不同,原因在于它们靠什么表示数值
现象:纵轴从 250 开始,三根柱子的差距看着大了三倍多。
概念:柱状图的纵轴必须从 0 起,因为柱子的长度就是数值本身;起点一抬,柱长表示的就变成了"超出起点的那一部分"。折线图看的是变化的走势,纵轴可以不从 0 起,否则数据挤成一条平线什么也看不出来,但起点必须清清楚楚标在轴上。这是两种图的根本差别,也是最常被用来误导的一处。
类比:从半山腰量身高,谁都显得矮,而且矮得不成比例。
比角度比不过比长度,这是人眼的限制
现象:三个班的饼图,三块看着差不多,读不出谁多。
概念:饼图靠角度表示占比,而人眼比较角度的能力远不如比较长度。类别超过五个,或者各类占比接近时,饼图就读不出差别,应当换成横向条形图。三维饼图与环形图在这个基础上更差:前排的扇形因为透视会显得比实际更大。
类比:五个人分蛋糕,看得出谁那块大;五十个人分,就只能看个热闹。
2.2数值是怎么变成一根柱子的
下面是成果页里数据区与柱状图部分的原文。整份文件里真正把数字变成图形的,就是中间那一行除法。
/* ============ 数据区:改这里,两张图跟着变 ============ */
const DATA = [
{ 月份: '3月', 数据2301: 38, 数据2302: 45, 数据2303: 52 },
// …中间四行省略…
{ 月份: '8月', 数据2301: 45, 数据2302: 47, 数据2303: 45 }
];
// 柱状图。纵轴一律从 0 起:柱子的长度就是数值本身
function drawBar(host, labels, values) {
const W = host.clientWidth, H = 260;
const pad = { t: 14, r: 10, b: 34, l: 40 };
const iw = W - pad.l - pad.r, ih = H - pad.t - pad.b;
const max = 350, step = 50; // 轴上限与刻度间隔
// 映射:数值 → 画布上的纵坐标
const y = v => pad.t + ih - v / max * ih;
// 网格线与刻度,从 0 画起
for (let v = 0; v <= max; v += step) {
svg.appendChild(el('line', { x1: pad.l, y1: y(v), x2: W - pad.r, y2: y(v),
stroke: v === 0 ? INK : LINE, 'stroke-width': v === 0 ? 1.4 : 1 }));
}
// 每个数据画一根柱子
labels.forEach((label, i) => {
svg.appendChild(el('rect', { x: cx - bw / 2, y: y(values[i]),
width: bw, height: ih - (y(values[i]) - pad.t), fill: GREEN }));
});
}
2.3把基线抬高 250,发生了什么
回到 1.3 节那两张图。左右两边的差别只有一处:映射公式里的起点。
268 画出来是 315 的 85%,与两个数字的真实关系一致。
268 只剩 18,315 剩 65,画出来是 28%,差距被放大了三倍多。
| 班级 | 真实人次 | 占最高的比例 | 从 0 起的柱长 | 从 250 起的柱长 |
|---|---|---|---|---|
| 数据2301 | 268 | 85% | 85% | 28% |
| 数据2302 | 292 | 93% | 93% | 65% |
| 数据2303 | 315 | 100% | 100% | 100% |
四项说明 · 配色 · 字体 · 三句话结论
图一旦被截图转发,周围那些文字就跟不过去了。
3.1另外四个知识点
缺任何一样,图被单独截出去就会被误读
现象:图上只有柱子和数字,没写单位,也没写是哪段时间的数据。
概念:一张能独立看懂的图要有四样:标题、单位、数据范围、来源。理由很实际:图一旦被截图转发,周围那些文字就跟不过去了,读者手上只剩这张图。四项齐全,这张图才敢让别人引用。
类比:没有落款和日期的通知,没人敢照着执行。
屏幕上好看与投影出来能看,是两件事
现象:投影出来之后,浅色的那条线在后排完全看不见。
概念:颜色在图上承担的是区分,不是装饰。两条要求:不要只靠颜色区分,同时加上标签或形状,因为红绿色觉障碍在男性中的比例约为百分之八;投影场景要保证足够的对比,浅灰浅黄这类在屏幕上好看的颜色,投出来往往就消失了。渐变、阴影、三维效果不承载任何信息,一律去掉。
类比:地铁线路图除了颜色还标线路号,色觉不同的人照样坐得了车。
Python 出图路线上第一个、也几乎必然会遇到的问题
现象:Python 出的图,中文标题全变成了方块。
概念:绘图库自带的默认字体不包含汉字,遇到汉字就画一个空方框,同时在终端里给出 Glyph missing 的提示。解决办法是在代码里显式指定一个系统里装着的中文字体。这与代码写得对不对没有关系。网页路线不会遇到,因为浏览器会自己找系统里的中文字体。
类比:一台没有中文字模的打字机。打英文没问题,打汉字就是一格空白。
投影用 PNG 时,导出分辨率不要低于 150 dpi
现象:同一张图放进文档很清楚,投到大屏上就糊了。
概念:矢量图(如 SVG)记录的是形状与坐标,放大多少倍都清晰,网页路线画出来的就是它;位图(如 PNG)记录的是一格格像素,放大就出现锯齿。另外,图上的字号要按最终的观看距离定,屏幕上刚合适的字号,投到教室后排常常就看不清了。
类比:名片上的字放到海报上就太小;照片放大到墙面那么大,就看得见马赛克。
3.2三句话结论:规模、分布、发现
图画完了,还差最后一步:用三句话把它说出来。三句话各回答一件事,顺序固定:
3.3前沿三分钟:图上的墨水该用在哪
每章固定栏目 · 一条与本章内容相关的行业动态
本章的减法不是审美偏好,它有个正式的名字。统计学者爱德华·塔夫特在一九八三年出版的《定量信息的视觉显示》中提出数据墨水比:一张图上用掉的墨水,应当尽可能多地用于表示数据本身,用于边框、底纹、装饰的越少越好。四十多年过去,这仍然是图表设计的基本准则。
准则的影响看得见。早期的图表软件默认给你加上立体边框、渐变背景、三维透视和阴影,那是当时的审美,也是软件展示自己能力的方式。这些年主流绘图库的默认样式越来越素:去掉多余的边框、把网格线调淡、默认不加阴影。变的不是审美潮流,是对"图是用来读的"这件事有了共识。
对本章的实际影响是:删东西时有一条可以说得出口的依据。不必和人争论好不好看,只需要问一句:这个元素承载了哪一部分数据。
先定结论 · 出图 · 砍装饰 · 以终图定功能
从一张汇总表,到一页可以直接投影的成果,再到一份砍干净的选题。
4.1演示步骤
4.2以终图定功能
成果页做完,期末选题就好定了。方法是把顺序倒过来:先画出作品最后要给人看的那张图,功能清单自然就收敛了。图上没有的东西,功能就不用做。
顺序不能反,砍的理由要看得见
为什么这样有效:对着一份功能清单砍需求,每一条看起来都有用,砍谁都心疼。而对着一张图砍,问题变成了一个事实判断:这个功能产出的数据,在图上占哪一块。占不到的,这次就不做。
打开 第15章演示_以终图定功能.html,先在终图上勾选你要显示的东西,页面会反过来算出你必须做哪几个功能,以及哪几个可以先不要。
4.3开题卡:五项,缺一项不算开题
三选一 · 六步 · 先画图再定功能
上机环节由此开始,当堂完成并提交。
5.1三个题目,任选其一
把自己期末选题要展示的数据做成一页,一句结论加两张图。
通用从一份文字材料里把数字提出来,做成一张图和一句结论。
偏文科同一份数据画两张图,一张规范一张误导,写清读者会被带偏到哪里。
偏理工三个题目都要求成果是单文件、双击可看、断网可看,并且四项说明要素齐全。数据可以自备,也可以用演示件里那份。允许更换题材。
5.2上机六步
前四步做成果页,后两步定期末选题。顺序不能反。
5.3共同验收标准
5.4常见错误与处理
5.5提交内容
提交方式:按教师提供的作业模板填写,文档开头注明所选题目。提交渠道见课堂通知,当堂提交。
5.6再进一步(选做)
给成果页加一个切换:同一份数据,一个按钮在"从 0 起"和"从 250 起"之间切换,让看的人自己点一下,亲眼看着柱子变形。
做完会碰到一个需要判断的问题:这个功能到底该不该放进正式的成果页。它把误导的手法展示了出来,对读者是提醒;但它也让页面多了一个与数据无关的交互,按本章的减法准则,第一个该删的就是它。同一个元素,在教学材料里该留,在汇报材料里该删,取决于这一页是给谁看的。
本章五条结论
- 先写出这张图要回答的那一句话,再决定画什么图。比大小用柱状,看变化用折线,看占比用饼图或条形。
- 柱状图的纵轴必须从 0 起。柱长就是数值,抬高起点等于凭空放大差距,而且挑不出硬伤。折线图可以不从 0 起,但起点要标在轴上。
- 一张图要能被单独看懂:标题、单位、数据范围、来源,四项缺一样,图被转发出去就会被误读。
- 三句话结论:规模、分布、发现。每说一句,指一下是从哪根柱子读出来的。指不出来源的结论是编的。
- 删一样东西之前先问它承载了哪一部分数据。答不上来的就是可以删的。这把刀同时用在图上的装饰和期末选题的功能上。