图不是装饰,是替人做减法:省掉「逐个比较」这一步,不省数据本身。 先想清楚要比什么,再决定画哪种图。反过来做,出来的图多半没法看。 饼图超过六块就别用了。十二块里有一大半扇区角度在 30 度以下,人眼分不出来。
前四章都在算数,这一章开始画图。画图之前先解决一个更前置的问题:画哪种。 这一章的图都存成 PNG,笔记里不放图片——你跑一遍代码就能看到原图。
一、图到底省了什么
一张 10 行 6 列的表,人眼要在列之间来回扫,比两行就得记一次数。 换成一张柱图,长短一比就完了,三秒出结论。 图省掉的是「逐个比较」这一步,不是省掉数据本身。
所以图不能替代表。要精确到小数位、要对账,还得回到表。
二、按「要比什么」选图
| 要比什么 | 用什么图 | 为什么 |
|---|---|---|
| 随时间变 | 折线图 | 横轴连续,看走势 |
| 比类别多少 | 柱形图 | 长度差异最容易被眼睛捕捉 |
| 看分布 | 直方图 | 分区间,看形状 |
| 看占比 | 饼图或环形图 | 整圆为 100% |
| 看两个量关系 | 散点图 | 每个点是一个观测 |
| 看累积 | 面积图 | 下面的面积是总量 |
| 看两维交叉 | 热力图 | 颜色当第三维 |
| 看四分位 | 箱形图 | 一次给五个数 |
八种图,八种比法。选错图等于用错尺子,量出来的数没错,但答的不是那个问题。
三、反例:十二块的饼图
造十二个月的数据,各月占比差不多。最小一块是 6,占 6.0%,扇区 21.6 度。 30 度以内的扇区,人眼已经分不清谁大谁小了。十二块里有一大半都在这条线附近。 饼图超过六块就别用了,换柱形图。同样的数据,柱子的长短一眼能排出来。
改成六块呢?最小一块占 5.0%,角度 18.0 度——还是小,但因为只有六块,能认出来。 经验线:占比小于 5% 的块,饼图上基本看不见。先数几块,再决定用不用饼图。
四、一张图由什么组成
figure(整张纸)
┌──────────────────────────┐
│ title(标题) │
│ ┌────────────────────┐ │
│y │ axes(绘图区)│ │
│a │ ╱╲ │ │
│x │ ╱ ╲ │ │
│i │ ╱ ╲ │ │
│s └────────────────────┘ │
│ xaxis(横轴) │
└──────────────────────────┘
名字先认识:figure 是纸,axes 是纸上的那块图,xaxis 和 yaxis 是两根轴。 tick 是刻度,label 是标签,title 是标题。后面每一节都会碰到其中几个。 一张纸可以贴好几块图。这时候「纸」和「图」就必须分清楚。
五、动手 Demo:图表的作用与怎么选
这一篇不画图,先算两个数:十二块饼图和六块饼图,最小那块占多少度。 角度这个数比「看着挤」有说服力——它能直接和「人眼分辨极限」比。
V12 = [9, 8, 9, 9, 10, 9, 8, 8, 9, 7, 6, 8]
V6 = [30, 25, 20, 12, 8, 5]
def sector(vals):
tot = sum(vals)
return [v * 360.0 / tot for v in vals]
for name, vals in [("十二块", V12), ("六块", V6)]:
ang = sector(vals)
print("%s:最小 %.1f 度,小于 30 度的有 %d 块"
% (name, min(ang), sum(1 for a in ang if a < 30)))
print("十二块里最小的占比 %.1f%%" % (min(V12) * 100.0 / sum(V12)))
实跑输出:
--------------------------------------------------------------------
图表的作用与怎么选
--------------------------------------------------------------------
① 图不是装饰,是替人做减法
--------------------------------------------------------------------
一张表 10 行 6 列,人眼要在列之间来回扫;一张柱图,长短一比就完了。
图省掉的是「逐个比较」这一步,不是省掉数据本身。
! 所以先想「要比什么」,再决定画哪种图。反过来做,出来的图多半没法看。
② 按「要比什么」选图
--------------------------------------------------------------------
| 要比什么 | 用什么图 | 为什么 |
|---|---|---|
| 随时间变 | 折线图 | 横轴连续,看走势 |
| 比几个类别的多少 | 柱形图 | 长度差异最容易被眼睛捕捉 |
| 看一列数的分布 | 直方图 | 分区间,看形状 |
| 看占比 | 饼图或环形图 | 整圆为 100%,角大即占比大 |
| 看两个量的关系 | 散点图 | 每个点是一个观测 |
| 看累积 | 面积图 | 下面的面积是总量 |
| 看两维交叉 | 热力图 | 颜色当第三维 |
| 看分布的四分位 | 箱形图 | 一次给五个数 |
八种图,八种「比法」。选错图等于用错尺子。
③ 反例:十二块的饼图
--------------------------------------------------------------------
十二个月占比差不多,最小一块是 6,占 6.0%,扇区角度 21.6 度。
三十度以内的扇区,人眼已经分不清谁大谁小了——十二块里有一大半都在这条线附近。
! 饼图超过六块就别用了,换柱形图。同样的数据,柱子的长短一眼能排出来。
④ 六个块就还行
--------------------------------------------------------------------
六块时,最小一块占 5.0%,角度 18.0 度,还能看出是「最小的一块」。
经验线:占比小于 5% 的块,饼图上就基本看不见了。
! 先数有几块,再决定用不用饼图。这一条能省掉很多返工。
⑤ 一张图的基本组成
--------------------------------------------------------------------
画布 figure、绘图区 axes、横轴 xaxis、纵轴 yaxis、刻度 tick、标签 label、标题 title。
后面每一节都会碰到其中几个,名字先认识,写代码时就不慌。
! figures 是「纸」,axes 是「纸上的那一块图」。一张纸可以贴好几块图。
十二块里小于 30 度的有 6 块——一半的扇区人眼分不清,这就是「别用饼图」的硬证据。 角度能算,眼力不能算。把「看着挤」翻译成「多少度」,讨论才有落点。
30 秒实验
- 把 V12 改成差异悬殊的十二个数,看最小那块还能不能到 30 度以上。
- 算一下 V6 最大那块的角度,想想它和最小块的比值意味着什么。
- 想一想:如果必须展示十二个月的占比,你会换成什么图?
常见误区
- 先画图再想问题:图很漂亮,但答不上「哪个班更好」这类问题。
- 用饼图展示十二个月:一半扇区分不清,读者只能看标签。
- 用折线连类别:语文、数学、英语之间没有「中间值」,连起来是假趋势。
- 以为图能替代表:要精确对账时还是得看表。
自测三问(点开对答案)
1. 图相比于表,省掉的是哪一步? —— 省掉「逐个比较」这一步。图不省数据,只省读者在数字之间来回扫的力气。 2. 为什么饼图块数不能多? —— 块多了每块的扇区角度就小。30 度以下人眼分不清谁大谁小,图就白画了。 3. 折线图和柱形图怎么选? —— 看横轴连不连续。时间、序号连续就用折线;类别无序就并排站柱子。知道该画什么了。下一篇上手:装好 Matplotlib,画出第一张图。
- ☐ (本篇完,下一篇 5.2 Matplotlib 初体验:第一张图)