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

折线的横轴必须连续(时间、序号),类别之间没有过渡,不该连成线。 并排柱要自己算位置:X 减半个宽、X 加半个宽,不然柱子会重叠。 柱形图的纵轴一定要从 0 起。柱子的长度就是数值大小,截断等于撒谎。

📝 本章和前面几章的关系

前几篇都在调图形零件。这一篇开始画实体:折线和柱形,最常用的两种。 数据是六个月的销售额,加上两个班的三科均值。

一、折线图:看趋势

六个月:128000、116000、143000、151000、138000、162000。 二月是个坑(116000),六月是高点(162000),整体往上走。 折线的横轴必须是连续的(时间、序号)。类别之间没有顺序,不该用折线。

marker 加不加都行。点少的时候加,读者能看清每个观测;点多了加就是一串黑点。 linestyle 可以是实线、虚线、点线,多条线时用线型区分比只靠颜色更保险。

二、柱形图:比大小

科目 一班 二班
语文 86.0 79.4
数学 83.2 82.8
英语 85.8 78.0

一班语文比二班高 6.6 分,英语高 7.8 分,数学只差 0.4 分。 一根柱子的长度差,比表里两个数并排好读得多——这正是柱形图的用处。 并排柱要自己算位置:X - W/2 和 X + W/2,W 是柱宽。

不算位置直接画两组,柱子会重叠。这是并排柱最常见的错。

三、横向柱:类别名长的时候

ax.barh(...) 画横向柱,标签在左边,长名字不会被挤成两行。 一班总分 1275、二班 1201。横过来之后,中文标签舒服多了。 类别名超过四个字,就改横向柱。这是排版上最省事的处理。

排过序的柱子比没排序好读。sort_values 一下,最大最小一眼看到。

四、折线还是柱形:一条判断标准

横轴是什么 用什么 理由
时间、序号(连续) 折线图 连续量之间的过渡有意义
类别(无序) 柱形图 类别之间没有「中间值」

「一月到二月之间」是有意义的,所以折线成立。 「语文到数学之间」没有意义,所以只能并排站柱子。 这一条判断标准比记图形名字管用:问横轴连不连续。

五、动手 Demo:折线图与柱形图

先画六个月的趋势折线,再画两个班的并排柱,最后来一张横向柱。 并排柱重点看位置怎么算——少一步柱子就叠在一起。

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

M = [128000, 116000, 143000, 151000, 138000, 162000]
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(range(6), M, marker="o")
ax.set_xticks(range(6))
ax.set_xticklabels(["一月", "二月", "三月", "四月", "五月", "六月"])
fig.tight_layout()
fig.savefig("line.png")

DF = pd.DataFrame({"班级": ["一班"] * 3 + ["二班"] * 3,
                   "科目": ["语文", "数学", "英语"] * 2,
                   "分": [86.0, 83.2, 85.8, 79.4, 82.8, 78.0]})
T = DF.pivot(index="科目", columns="班级", values="分")

X = np.arange(3)
W = 0.35
fig, ax = plt.subplots(figsize=(6, 4))
ax.bar(X - W / 2, T["一班"], W, label="一班")
ax.bar(X + W / 2, T["二班"], W, label="二班")
ax.set_xticks(X)
ax.set_xticklabels(T.index)
ax.legend()
fig.tight_layout()
fig.savefig("bar.png")
print(T.round(1).to_string())

实跑输出:

--------------------------------------------------------------------
折线图与柱形图
--------------------------------------------------------------------

  ① 折线图:看趋势
  --------------------------------------------------------------------
  六个月:128000、116000、143000、151000、138000、162000。
  二月是个坑(116000),六月是高点(162000),整体往上走。
  折线的横轴必须是连续的(时间、序号)。类别之间没有顺序,不该用折线。

  ② 柱形图:比大小
  --------------------------------------------------------------------
  一班三科 86.0、83.2、85.8;二班 79.4、82.8、78.0。
  并排柱要自己算位置:X 减半个宽、X 加半个宽,不然柱子会重叠。
  ! 柱形图的纵轴一定要从 0 起。柱子的长度就是数值大小,截断等于撒谎。

  ③ 横向柱:类别名长的时候
  --------------------------------------------------------------------
  一班总分 1275、二班 1201。横向柱的标签在左边,长名字不会被挤成两行。
  类别名超过四个字,就改横向柱。这是排版上最省事的处理。
  ! 排过序的柱子比没排序好读。sort_values 一下,读者一眼看到最大最小。

  ④ 折线还是柱形
  --------------------------------------------------------------------

| 横轴是什么 | 用什么 | 理由 |
|---|---|---|
| 时间、序号(连续) | 折线图 | 连续量之间的过渡有意义 |
| 类别(无序) | 柱形图 | 类别之间没有「中间值」 |

  「一月到二月之间」是有意义的,所以折线成立。
  「语文到数学之间」没有意义,所以只能并排站柱子。
  ! 这一条判断标准比记图形名字管用:问横轴连不连续。

X - W/2 和 X + W/2 各让半个柱宽,两根柱子就并排站开,边缘刚好贴着。 柱宽加起来不能超过 1。两根 0.35 是 0.7,还剩 0.3 的空隙。

30 秒实验

  1. 把 W 改成 0.5,看两根柱子还剩多少空隙,再改成 0.6 试试。
  2. 把 bar 换成 barh,看布局怎么变。
  3. 想一想:如果横轴是「第一季度、第二季度、第三季度」,该用折线还是柱形?

常见误区

  1. 并排柱不算位置:两组柱子重叠,后面的盖住前面的。
  2. 柱形图截断纵轴:柱长不再等于数值。
  3. 类别数据用折线:连出一条不存在的趋势。
  4. 柱宽之和不留空隙:两根柱贴死,看着像一根。
自测三问(点开对答案) 1. 并排柱为什么要 X 加减半个柱宽? —— 让两组柱子以刻度为中心各偏一半,这样它们并排站开且不重叠。 2. 什么时候该用横向柱? —— 类别名长(超过四个字)的时候,横向柱的标签在左边,不会被挤成两行。 3. 折线图和柱形图的判断标准是什么? —— 横轴连不连续。连续(时间、序号)用折线,无序类别用柱形。

折线柱形都会了。下一篇讲一个特别容易被误解的图:直方图。

相关笔记