📊 第5章 可视化数据分析图表
📄 一句话概括

图不是装饰,是替人做减法:省掉「逐个比较」这一步,不省数据本身。 先想清楚要比什么,再决定画哪种图。反过来做,出来的图多半没法看。 饼图超过六块就别用了。十二块里有一大半扇区角度在 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 秒实验

  1. 把 V12 改成差异悬殊的十二个数,看最小那块还能不能到 30 度以上。
  2. 算一下 V6 最大那块的角度,想想它和最小块的比值意味着什么。
  3. 想一想:如果必须展示十二个月的占比,你会换成什么图?

常见误区

  1. 先画图再想问题:图很漂亮,但答不上「哪个班更好」这类问题。
  2. 用饼图展示十二个月:一半扇区分不清,读者只能看标签。
  3. 用折线连类别:语文、数学、英语之间没有「中间值」,连起来是假趋势。
  4. 以为图能替代表:要精确对账时还是得看表。
自测三问(点开对答案) 1. 图相比于表,省掉的是哪一步? —— 省掉「逐个比较」这一步。图不省数据,只省读者在数字之间来回扫的力气。 2. 为什么饼图块数不能多? —— 块多了每块的扇区角度就小。30 度以下人眼分不清谁大谁小,图就白画了。 3. 折线图和柱形图怎么选? —— 看横轴连不连续。时间、序号连续就用折线;类别无序就并排站柱子。

知道该画什么了。下一篇上手:装好 Matplotlib,画出第一张图。

相关笔记