折线的横轴必须连续(时间、序号),类别之间没有过渡,不该连成线。 并排柱要自己算位置: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 秒实验
- 把 W 改成 0.5,看两根柱子还剩多少空隙,再改成 0.6 试试。
- 把 bar 换成 barh,看布局怎么变。
- 想一想:如果横轴是「第一季度、第二季度、第三季度」,该用折线还是柱形?
常见误区
- 并排柱不算位置:两组柱子重叠,后面的盖住前面的。
- 柱形图截断纵轴:柱长不再等于数值。
- 类别数据用折线:连出一条不存在的趋势。
- 柱宽之和不留空隙:两根柱贴死,看着像一根。
自测三问(点开对答案)
1. 并排柱为什么要 X 加减半个柱宽? —— 让两组柱子以刻度为中心各偏一半,这样它们并排站开且不重叠。 2. 什么时候该用横向柱? —— 类别名长(超过四个字)的时候,横向柱的标签在左边,不会被挤成两行。 3. 折线图和柱形图的判断标准是什么? —— 横轴连不连续。连续(时间、序号)用折线,无序类别用柱形。折线柱形都会了。下一篇讲一个特别容易被误解的图:直方图。
- ☐ (本篇完,下一篇 5.7 直方图:看清一列数的形状)