第8章 Python 可视化
脚本化绘图的价值:可复现、可批量、能嵌进分析流程。
本章学习目标
- 能安装并配置 matplotlib 的中文字体与主题
- 能用 matplotlib 画折线、柱状、散点、直方图并设置标注
- 能用 seaborn 快速做统计类图表(箱线图、热力图、回归图)
- 能用 pyecharts 输出可交互的 HTML 图表
本章导览
核心内容
8.1
环境与中文显示
pip install matplotlib seaborn pandas pyecharts
# 中文显示(Windows 用 SimHei,macOS 用 PingFang SC,Linux 用 WenQuanYi)
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False # 负号显示90% 的"中文变成方块"都是这两行没写;负号变方块只需第二行。
8.2
matplotlib 基础
matplotlib 的层次是:Figure(画布)→ Axes(坐标系)→ 图形元素。推荐用面向对象写法 <code class="inl">fig, ax</code>,便于多子图。
8.2.1
四类基础图
import pandas as pd, matplotlib.pyplot as plt
df = pd.read_csv('sales.csv')
fig, ax = plt.subplots(figsize=(8, 4), dpi=120)
# 折线图(时间趋势)
ax.plot(df['month'], df['sales'], marker='o', linewidth=2, label='销售额')
# 柱状图(分类比较)
# ax.bar(df['province'], df['sales'])
# 散点图(两变量关系)
# ax.scatter(df['price'], df['qty'], alpha=0.6)
# 直方图(分布)
# ax.hist(df['sales'], bins=20)
ax.set_title('2025 年月度销售额(万元)') # 标题写结论
ax.set_xlabel('月份'); ax.set_ylabel('销售额(万元)')
ax.grid(axis='y', linestyle='--', alpha=0.3) # 只留水平网格
ax.legend(loc='upper left', frameon=False)
plt.tight_layout()
plt.savefig('sales.png', bbox_inches='tight')
plt.show()8.2.2
常用美化与多子图
# 多子图:1 行 2 列
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
axes[0].bar(df['province'], df['sales']); axes[0].set_title('各省销售额')
axes[1].plot(df['month'], df['sales']); axes[1].set_title('月度趋势')
# 标注关键点
ax.annotate('促销月', xy=(6, 320), xytext=(7, 380),
arrowprops=dict(arrowstyle='->', color='gray'))
# 统一风格
plt.style.use('seaborn-v0_8-whitegrid')8.3
seaborn:统计图更快
import seaborn as sns
# 箱线图:看分布与异常值
sns.boxplot(data=df, x='province', y='sales')
# 热力图:两维交叉的数值矩阵
pivot = df.pivot_table(index='weekday', columns='hour', values='visits')
sns.heatmap(pivot, cmap='Blues', annot=False)
# 回归图:散点 + 趋势线 + 置信区间
sns.regplot(data=df, x='price', y='qty', scatter_kws={'alpha': 0.5})💡 seaborn 的默认配色与主题已经"能用",做内部报表几乎不用再调;对外交付再统一字体与尺寸。
8.4
pyecharts:输出可交互图表
from pyecharts.charts import Bar, Line
from pyecharts import options as opts
bar = (
Bar()
.add_xaxis(df['province'].tolist())
.add_yaxis('销售额', df['sales'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title='各省销售额'),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)),
toolbox_opts=opts.ToolboxOpts(is_show=True),
)
)
bar.render('province_bar.html') # 生成可直接打开的 HTMLpyecharts 生成的是 HTML(内含 ECharts),可以直接双击打开、也可以嵌进网页——这正是第 9 章 Web 可视化的入口。
本章小结
本章是"脚本化绘图"的完整入门:先解决中文与负号显示,再用 matplotlib 的 fig/ax 面向对象写法画折线、柱状、散点、直方图并做标注与多子图,然后用 seaborn 三行代码得到箱线图、热力图与回归图,最后用 pyecharts 输出可交互 HTML。
思考与练习 先自己做,再点开答案
01
图里的中文全是方块,怎么解决?
查看参考答案
设置中文字体:matplotlib.rcParams["font.sans-serif"]=["SimHei"];若负号也异常再加 axes.unicode_minus=False。Linux 环境需先安装中文字体。
02
要同时展示"各省销售额柱状图"和"月度趋势折线图",怎么排?
查看参考答案
用 plt.subplots(1, 2) 建两个 Axes,分别画柱状与折线,各自设置标题;两图共用一套配色与字号。
03
matplotlib 与 pyecharts 该怎么选?
查看参考答案
要静态图(论文、报告、批量出图)用 matplotlib/seaborn;要交互(悬浮提示、缩放、下钻)用 pyecharts,产出 HTML 便于分享。