Python 数据可视化实战入门教程
作者:wcy
适用人群:已学完 Python 3 基础与《Python Pandas 数据处理实战教程》,想用图表展示数据规律与报表的初学者
版本说明:本教程基于 Python 3 (3.8+ 通用),核心库 matplotlib
目录
- 本教程定位
- [matplotlib 是什么](#matplotlib 是什么)
- 环境准备
- 第一个图
- 折线图
- 柱状图
- 饼图
- 散点图
- 直方图
- 标题与图例标签
- 颜色与样式
- 多子图
- 中文显示
- 保存图片
- [实战一:把 Pandas 数据画成图表](#实战一:把 Pandas 数据画成图表)
- 实战二:销售综合分析图
- 小结与练习
1. 本教程定位
上一篇用 Pandas 算出了三张销售报表------可老板不看数字,要看图。一张柱状图胜过三行表格。matplotlib 是 Python 最经典的绘图库,能画折线、柱状、饼、散点、直方等几乎所有图表。
本教程解决四类问题:
- 画什么:折线/柱状/饼/散点/直方分别适合什么数据?
- 怎么画:每种图的完整代码长什么样?
- 怎么美化:标题、轴标签、图例、刻度、颜色、网格怎么配?
- 怎么落地:多图拼版、Pandas 数据直出、保存高清图片?
学完你将能:把 Pandas 处理好的数据一键画成专业图表,并组合成一张分析仪表盘。
前置要求:已学《Python Pandas 数据处理实战教程》。需要
pip install matplotlib。
2. matplotlib 是什么
2.1 一句话定义
matplotlib 是 Python 的 2D 绘图库,把数据画成期刊质量的静态图形,并支持导出 PNG/JPG/SVG/PDF。
2.2 图表示意
┌────────────────────────────────────┐
│ 2026 年每月销售额(标题) │
│ │
│ 销售额 (万元) │ ← y 轴标签
│ 40─┼ ●────●── (折线)│
│ 30─┼ ● ● │
│ 20─┼ ● ──● │
│ 10─┼ ● ● │
│ 0─┴──┬────┬────┬────┬────┬────│
│ 1月 2月 3月 4月 5月 │ ← x 轴刻度
│ │
│ -- 手机 -- 电脑(图例) │
└────────────────────────────────────┘
2.3 三个核心概念
| 概念 | 说明 | 例子 |
|---|---|---|
| Figure | 整张画布 | plt.figure() |
| Axes | 画布上的一个绘图区 | fig.add_subplot(1,1,1) |
| Artist | 图中的每个元素 | 线条、文本、图例 |
plt.plot()快捷写法自动创建 Figure + Axes;页面多图时就要显式用plt.subplots()。
3. 环境准备
3.1 安装
bash
pip install matplotlib
3.2 验证
python
import matplotlib
print(matplotlib.__version__) # 3.x
3.3 引用惯例
python
import matplotlib.pyplot as plt # 官方推荐别名
import numpy as np # 造数据常用
3.4 运行方式
| 环境 | 说明 |
|---|---|
| Jupyter Notebook | 直接 %matplotlib inline,图自动显示 |
| 命令行脚本 | 最后 plt.show() 弹出窗口(阻塞直到关窗) |
| 无显示服务器 | 用 plt.savefig() 保存,见第 14 章 |
本教程示例默认在命令行脚本中运行,最后调用
plt.show()。
4. 第一个图
4.1 最小折线
python
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]
plt.plot(x, y)
plt.show()
4.2 风格与细节
python
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 5, 3]
plt.plot(x, y, color='red', marker='o', linestyle='--', linewidth=2)
plt.title('我的第一个图')
plt.xlabel('x 轴')
plt.ylabel('y 轴')
plt.grid(True)
plt.show()
4.3 plot 常用参数
| 参数 | 作用 | 例子 |
|---|---|---|
color |
颜色 | 'red' '#ff6600' |
marker |
数据点标记 | 'o' 's' '^' |
linestyle |
线型 | '-' '--' ':' |
linewidth |
线宽 | 2 |
alpha |
透明度 | 0.5 |
label |
图例名 | '手机' |
markersize |
点大小 | 8 |
4.4 画布大小
python
plt.figure(figsize=(10, 6)) # 英寸,先宽后高
plt.plot(x, y)
plt.show()
保存成图片时
figsize决定图片基本比例,导出再乘dpi得像素。常用(10, 6)(8, 5)。
5. 折线图
5.1 适用场景
展示随时间变化趋势:销售额、温度、股价、用户增长。
5.2 单条折线
python
import matplotlib.pyplot as plt
months = ['1月', '2月', '3月', '4月', '5月']
sales = [12, 18, 15, 22, 27]
plt.plot(months, sales, marker='o')
plt.title('月度销售额')
plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.show()
5.3 多条折线 + 图例
python
months = ['1月', '2月', '3月', '4月', '5月']
phone = [12, 18, 15, 22, 27]
computer = [8, 10, 14, 16, 19]
plt.plot(months, phone, marker='o', label='手机')
plt.plot(months, computer, marker='s', label='电脑')
plt.legend()
plt.show()
5.4 填充区域
python
plt.fill_between(months, phone, alpha=0.2)
5.5 网格与刻度
python
plt.grid(True, linestyle='--', alpha=0.5)
plt.xticks(rotation=45) # 刻度旋转,防重叠
6. 柱状图
6.1 适用场景
对比离散类别的大小:各部门业绩、各城市销量、各产品收入。
6.2 基础柱状图
python
import matplotlib.pyplot as plt
cities = ['北京', '上海', '广州', '深圳']
sales = [320, 280, 210, 260]
plt.bar(cities, sales)
plt.title('各城市销售额')
plt.ylabel('销售额(万元)')
plt.show()
6.3 横向柱状图(类别名很长时)
python
plt.barh(cities, sales)
plt.xlabel('销售额(万元)')
plt.show()
6.4 分组柱状图
python
import numpy as np
cities = ['北京', '上海', '广州']
phone = [120, 100, 80]
computer = [90, 70, 60]
x = np.arange(len(cities)) # [0 1 2]
width = 0.35
plt.bar(x - width/2, phone, width, label='手机')
plt.bar(x + width/2, computer, width, label='电脑')
plt.xticks(x, cities)
plt.legend()
plt.show()
6.5 堆叠柱状图
python
plt.bar(cities, phone, label='手机')
plt.bar(cities, computer, bottom=phone, label='电脑') # bottom 累加
plt.legend()
plt.show()
6.6 数值标签
python
bars = plt.bar(cities, sales)
for bar in bars:
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height(),
str(int(bar.get_height())), ha='center', va='bottom')
7. 饼图
7.1 适用场景
展示占比构成:市场份额、预算分配、流量来源。类别别超过 6 个。
7.2 基础饼图
python
import matplotlib.pyplot as plt
labels = ['手机', '电脑', '平板', '配件']
sizes = [45, 30, 15, 10]
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
plt.title('产品占比')
plt.show()
7.3 美化参数
python
plt.pie(
sizes,
labels=labels,
autopct='%1.1f%%', # 显示百分比(1 位小数)
colors=['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24'],
explode=[0.05, 0, 0, 0], # 第一块凸出
shadow=True, # 阴影
startangle=90, # 起始角度
pctdistance=0.7, # 百分比离中心距离
)
plt.axis('equal') # 保证是正圆
7.4 环形图(donut)
python
plt.pie(sizes, labels=labels, autopct='%1.1f%%', wedgeprops={'width': 0.4})
7.5 注意
- 饼图只适合"加起来有意义"的占比数据;
- 类别多(>6)或看不见差异时改用柱状图。
8. 散点图
8.1 适用场景
看两变量相关关系:广告费 vs 销售额、身高 vs 体重、温度 vs 销量。
8.2 基础散点
python
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.default_rng(42)
x = rng.normal(50, 10, 100)
y = x * 0.8 + rng.normal(0, 5, 100) # 线性关系 + 噪声
plt.scatter(x, y)
plt.xlabel('广告费(千元)')
plt.ylabel('销售额(万元)')
plt.show()
8.3 大小/颜色映射第三维
python
sizes = rng.uniform(20, 200, 100) # 点大小
colors = y # 颜色深浅
sc = plt.scatter(x, y, s=sizes, c=colors, cmap='viridis', alpha=0.7)
plt.colorbar(sc, label='销售额') # 颜色条
plt.show()
8.4 对比分组散点
python
x1 = rng.normal(50, 10, 50)
y1 = rng.normal(60, 8, 50)
x2 = rng.normal(70, 10, 50)
y2 = rng.normal(80, 8, 50)
plt.scatter(x1, y1, color='blue', alpha=0.6, label='方案一')
plt.scatter(x2, y2, color='red', alpha=0.6, label='方案二')
plt.legend()
plt.show()
9. 直方图
9.1 适用场景
看单变量的分布形态:成绩分布、用户年龄分布、误差分布。
9.2 基础直方图
python
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.default_rng(7)
scores = rng.normal(75, 12, 500)
plt.hist(scores, bins=15)
plt.title('成绩分布')
plt.xlabel('分数')
plt.ylabel('人数')
plt.show()
9.3 关键参数
| 参数 | 作用 |
|---|---|
bins |
分桶数(默认 10) |
density=True |
归一化为概率密度 |
alpha |
透明度(多组叠着用时) |
edgecolor |
柱子描边 |
cumulative=True |
累积分布 |
9.4 多组对比
python
rng2 = np.random.default_rng(8)
scores_b = rng2.normal(70, 15, 500)
plt.hist(scores, bins=15, alpha=0.5, label='一班')
plt.hist(scores_b, bins=15, alpha=0.5, label='二班')
plt.legend()
plt.show()
9.5 直方图 vs 柱状图
| 区别 | 柱状图 | 直方图 |
|---|---|---|
| 数据 | 分类 | 连续数值 |
| x 轴 | 类别名 | 数值区间 |
| 高度 | 该类的值 | 落入区间的频数 |
10. 标题与图例标签
10.1 三层标题
python
plt.title('主标题', fontsize=16)
plt.suptitle('整图总标题') # 多子图公用的总标题
plt.xlabel('x 轴', fontsize=12)
plt.ylabel('y 轴', fontsize=12)
10.2 图例位置
python
plt.legend() # 自动,默认左上
plt.legend(loc='upper right')
plt.legend(loc='lower left', fontsize=10)
plt.legend(loc='best') # 自动找不挡数据的位置
plt.legend(ncol=2) # 两列排
plt.legend(bbox_to_anchor=(1.05, 1)) # 图外右侧
10.3 注解与文字
python
plt.annotate('峰值', xy=(3, 22), xytext=(3.5, 20),
arrowprops=dict(arrowstyle='->'))
plt.text(1, 5, '说明文字')
10.4 刻度设置
python
import matplotlib.ticker as mticker
plt.xticks([0, 1, 2, 3, 4], ['一', '二', '三', '四', '五'])
plt.xticks(rotation=45)
plt.yticks(np.arange(0, 101, 20)) # 0~100 步长 20
plt.tick_params(labelsize=11)
plt.gca().yaxis.set_major_formatter(mticker.FormatStrFormatter('%.0f万'))
11. 颜色与样式
11.1 内置主题
python
plt.style.available # 查看全部主题名
plt.style.use('ggplot') # 用朴素风
plt.style.use('seaborn-v0_8') # 好看的海边风
plt.style.use('fivethirtyeight')
plt.style.use('dark_background')
11.2 颜色写法
| 写法 | 例子 |
|---|---|
| 单字母 | 'r' 'g' 'b' |
| 名称 | 'red' 'steelblue' |
| 十六进制 | '#ff6600' |
| RGB 元组 | (0.2, 0.4, 0.8) |
11.3 色板与 colormap
python
import matplotlib.pyplot as plt
cmap = plt.get_cmap('viridis') # 常用:viridis/plasma/coolwarm
colors = cmap(np.linspace(0, 1, 5))
plt.pie([10, 10, 10, 10, 10], colors=colors, labels=list('ABCDE'))
11.4 一处风格管所有图
python
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['font.size'] = 12
plt.rcParams['axes.grid'] = True
plt.rcParams['grid.linestyle'] = '--'
plt.rcParams['lines.linewidth'] = 2
plt.rcParams['figure.dpi'] = 100
rcParams是全局默认配置,脚本开头统一设置即可让所有图风格一致。
12. 多子图
12.1 subplots 布局
python
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 2 行 2 列
axes[0, 0].plot([1, 2, 3], [3, 1, 2])
axes[0, 1].bar(['a', 'b', 'c'], [4, 2, 5])
axes[1, 0].scatter([1, 2, 3], [2, 4, 1])
axes[1, 1].pie([40, 30, 30], labels=['A', 'B', 'C'])
plt.tight_layout() # 自动调整间距
plt.show()
12.2 用 Axes 对象画图
plt.subplots 返回的 axes 数组里的每个元素,方法和 plt 一样:
python
ax = axes[0, 0]
ax.set_title('折线')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
12.3 共享 x 轴
python
fig, axes = plt.subplots(2, 1, figsize=(8, 6), sharex=True)
12.4 不等宽布局(gridspec)
python
fig = plt.figure(figsize=(10, 6))
gs = fig.add_gridspec(2, 2, height_ratios=[2, 1], width_ratios=[3, 1])
ax1 = fig.add_subplot(gs[0, 0]) # 左上(占高)
ax2 = fig.add_subplot(gs[0, 1]) # 右上
ax3 = fig.add_subplot(gs[1, :]) # 底部整行
13. 中文显示
13.1 问题
默认字体不支持中文,直接显示"□□□"或方块。必须指定支持中文的字体。
13.2 方法一:全局设置(推荐)
python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
plt.rcParams['axes.unicode_minus'] = False # 负号正常显示
13.3 方法二:常用备选字体
| 系统 | 字体名 |
|---|---|
| Windows | 'SimHei'(黑体)'Microsoft YaHei'(微软雅黑) |
| macOS | 'PingFang SC' 'Arial Unicode MS' |
| Linux | 'WenQuanYi Zen Hei' 'Noto Sans CJK SC' |
python
import matplotlib.font_manager as fm
print([f.name for f in fm.fontManager.ttflist if 'Hei' in f.name or 'YaHei' in f.name])
13.4 单个元素指定字体名
python
plt.title('中文标题', fontproperties='SimHei')
13.5 完整可用模板
python
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot([1, 2, 3], [3, 1, 2], marker='o')
plt.title('中文标题')
plt.show()
14. 保存图片
14.1 savefig 保存
python
plt.savefig('chart.png') # PNG
plt.savefig('chart.jpg', dpi=150) # JPG + 高分辨率
plt.savefig('chart.pdf') # 矢量 PDF
plt.savefig('chart.svg') # 矢量 SVG(网页用)
14.2 高清与参数
| 参数 | 作用 |
|---|---|
dpi=150 |
像素密度(默认 100,期刊图常用 300) |
bbox_inches='tight' |
裁掉多余空白 |
transparent=True |
透明背景 |
facecolor='white' |
白底 |
python
plt.savefig('report.png', dpi=300, bbox_inches='tight')
14.3 保存后不用弹窗
python
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
fig.savefig('report.png') # 先存文件
plt.close(fig) # 再关闭,不弹窗
批量生成报表时用 savefig + close,不要 plt.show()(会阻塞)。
14.4 支持格式
| 格式 | 特点 | 用途 |
|---|---|---|
| PNG | 栅格,通用 | 网页/微信 |
| JPG | 栅格,小 | 照片类 |
| 矢量 | 打印/论文 | |
| SVG | 矢量 | 网页放大不糊 |
15. 实战一:把 Pandas 数据画成图表
15.1 目标
Pandas 处理后直接上图:商品汇总柱状图、月度趋势折线图、城市透视热力图(用 bar 近似)。
15.2 复用销售数据
python
import matplotlib.pyplot as plt
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.DataFrame({
'城市': ['北京', '上海', '广州', '深圳', '北京', '上海'],
'商品': ['手机', '手机', '电脑', '电脑', '手机', '电脑'],
'数量': [10, 5, 3, 8, 12, 2],
'单价': [5000, 5200, 7000, 6800, 4900, 7200],
'月份': [1, 1, 2, 2, 3, 3],
})
df['金额'] = df['数量'] * df['单价']
真实工作中数据从
pd.read_csv(...)读入,本例用造数据保证人人可复现。
15.3 图一:商品销售额柱状图
python
g = df.groupby('商品')['金额'].sum().sort_values()
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(g.index, g.values, color=['#4ecdc4', '#ff6b6b'])
ax.set_title('各商品销售额')
ax.set_ylabel('销售额(元)')
for i, v in enumerate(g.values):
ax.text(i, v, f'{v:,}', ha='center', va='bottom')
plt.tight_layout()
plt.savefig('商品销售额.png', dpi=150, bbox_inches='tight')
plt.show()
15.4 图二:月度销售趋势折线图
python
m = df.groupby('月份')['金额'].sum()
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(m.index, m.values, marker='o', linewidth=2, color='steelblue')
ax.fill_between(m.index, m.values, alpha=0.2, color='steelblue')
ax.set_title('月度销售趋势')
ax.set_xlabel('月份')
ax.set_ylabel('销售额(元)')
ax.set_xticks(m.index)
plt.tight_layout()
plt.savefig('月度趋势.png', dpi=150, bbox_inches='tight')
plt.show()
15.5 图三:城市×商品分组柱状图
python
pivot = pd.pivot_table(df, values='金额', index='城市',
columns='商品', aggfunc='sum', fill_value=0)
fig, ax = plt.subplots(figsize=(8, 5))
pivot.plot(kind='bar', ax=ax) # Pandas 自带绘图入口
ax.set_title('城市 × 商品销售额')
ax.set_ylabel('销售额(元)')
ax.legend(title='商品')
ax.set_xticklabels(ax.get_xticklabels(), rotation=0)
plt.tight_layout()
plt.savefig('城市商品对比.png', dpi=150, bbox_inches='tight')
plt.show()
15.6 Pandas 快捷绘图入口
python
df['金额'].plot(kind='line') # 折线
df.groupby('商品')['金额'].sum().plot(kind='bar') # 柱状
df['数量'].plot(kind='hist', bins=10) # 直方
df.plot(kind='scatter', x='数量', y='金额') # 散点
df.plot(kind=...)底层仍是 matplotlib,只是帮你少写几行。想精细控制就用 matplotlib 原接口。
16. 实战二:销售综合分析图
16.1 目标
把前三张图拼进一张 2×2 仪表盘,加上 np.random 数据模拟 12 个月数据,形成"月度销售趋势 + 各商品占比 + 各城市对比 + 广告费 vs 销量散点"四合一图。
16.2 完整代码
python
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
rng = np.random.default_rng(42)
# 造 12 个月数据
months = np.arange(1, 13)
sales = rng.integers(80, 150, size=12)
ad_cost = np.linspace(20, 60, 12) + rng.normal(0, 5, 12)
products = ['手机', '电脑', '平板', '配件']
product_share = np.array([45, 30, 15, 10])
cities = ['北京', '上海', '广州', '深圳']
city_sales = np.array([320, 280, 210, 260])
fig, axes = plt.subplots(2, 2, figsize=(12, 9))
fig.suptitle('2026 年销售综合分析', fontsize=18)
# 1. 月度销售趋势(折线)
ax = axes[0, 0]
ax.plot(months, sales, marker='o', color='steelblue', label='销售额')
ax.set_title('月度销售趋势')
ax.set_xlabel('月份')
ax.set_ylabel('销售额(万元)')
ax.legend()
# 2. 产品占比(饼图)
ax = axes[0, 1]
ax.pie(product_share, labels=products, autopct='%1.1f%%',
explode=[0.05, 0, 0, 0],
colors=['#ff6b6b', '#4ecdc4', '#45b7d1', '#f9ca24'])
ax.set_title('产品占比')
# 3. 各城市销售额(柱状)
ax = axes[1, 0]
bars = ax.bar(cities, city_sales, color=['#4ecdc4', '#45b7d1', '#ff6b6b', '#f9ca24'])
ax.set_title('各城市销售额')
ax.set_ylabel('万元')
for bar in bars:
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height(),
str(int(bar.get_height())), ha='center', va='bottom')
# 4. 广告费 vs 销售额(散点)
ax = axes[1, 1]
sc = ax.scatter(ad_cost, sales, c=sales, cmap='plasma', s=60, alpha=0.8)
ax.set_title('广告费与销售额关系')
ax.set_xlabel('广告费(万元)')
ax.set_ylabel('销售额(万元)')
fig.colorbar(sc, ax=ax)
plt.tight_layout()
plt.savefig('销售分析仪表盘.png', dpi=200, bbox_inches='tight')
plt.show()
16.3 运行结果
一张 2×2 大图:左上趋势、右上占比、左下城市对比、右下相关性,每张子图独立标题,配色统一。
16.4 仪表盘技巧总结
| 技巧 | 代码 |
|---|---|
| 大标题 | fig.suptitle() |
| 摆 2×2 图 | plt.subplots(2, 2) |
| 对齐间距 | plt.tight_layout() |
| 一张出图 | plt.savefig('xxx.png', dpi=200, bbox_inches='tight') |
| 颜色映射第三维 | scatter(c=数值, cmap=...) + colorbar |
17. 小结与练习
17.1 知识点速查
| 主题 | 关键 API |
|---|---|
| 画布 | plt.figure(figsize=) |
| 折线 | plt.plot(x, y, marker=, label=) |
| 柱状 | plt.bar / plt.barh(分组/堆叠) |
| 饼图 | plt.pie(sizes, autopct=, explode=) |
| 散点 | plt.scatter(x, y, s=, c=, cmap=) |
| 直方 | plt.hist(x, bins=) |
| 文本 | title/xlabel/ylabel/legend/annotate/text |
| 多子图 | plt.subplots(2, 2) + use gridspace |
| 中文 | rcParams['font.sans-serif']=['SimHei'] |
| 保存 | plt.savefig('a.png', dpi=300, bbox_inches='tight') |
| 风格 | plt.style.use() / plt.rcParams |
17.2 选图流程
要表达什么?
├─ 随时间变化 → 折线图(多条对比)
├─ 类别对比 → 柱状图(横向/分组/堆叠)
├─ 占比 → 饼图(≤6 类)或堆叠柱状
├─ 相关关系 → 散点图(可加颜色/大小维度)
└─ 分布 → 直方图(多组叠加对比)
17.3 课后练习
- 基础:画 2026 年前 6 个月两产品销售额折线对比图(自己造数据),加图例、网格、标题。
- 柱状:把上一题的 6 个月数据画成分组柱状图,并给每根柱子加数值标签。
- 占比:统计你最近一个月各 app 使用时长占比,画饼图并让最大的那块凸出。
- 关系:收集 20 个城市"温度 vs 冰淇淋销量"假数据,画散点图判断相关方向。
- 分布:生成 3 组不同标准差的正态数据(各 500 点),直方图叠加对比并加透明度。
- 中文:造一张含中文标题、中文刻度、负数的图,验证中文显示与负号正常。
- 多子图:把练习 1~4 的四张图拼成 2×2 仪表盘并保存 PNG。
- Pandas 直出 :读取一篇练习里的 CSV,用
df.plot(kind=...)输出柱状 + 折线两张图。
17.4 常见问题
Q1:中文全显示成方块?
A:设置 plt.rcParams['font.sans-serif'] = ['SimHei'](Windows)/ ['PingFang SC'](macOS),同时 rcParams['axes.unicode_minus'] = False。
Q2:plt.show() 后窗口不显示/闪退?
A:命令行脚本要先 import matplotlib.pyplot as plt 再调用;企业环境无图形界面时改用 savefig。
Q3:保存的图片四周空白太多?
A:plt.savefig('x.png', bbox_inches='tight') 自动裁边。
Q4:多张图叠在一起看不清?
A:用 plt.subplots 分开,最后 plt.tight_layout();还挤就调大 figsize。
Q5:图例挡住了数据?
A:loc='best' 或 loc='upper right',或 bbox_to_anchor=(1.05, 1) 放图外。
Q6:柱状图 x 轴标签重叠?
A:plt.xticks(rotation=45) 旋转,或改横向柱状 barh。
Q7:负号显示成方框?
A:plt.rcParams['axes.unicode_minus'] = False。
Q8:df.plot 和 plt.plot 有什么区别?
A:df.plot 是 Pandas 封装,少写代码但可定制性低;需要精细控制时全部用 matplotlib 原生接口。