前哨站/第8章 Python 可视化
第8章 Python 可视化

第8章 Python 可视化

脚本化绘图的价值:可复现、可批量、能嵌进分析流程。

matplotlibseabornpyecharts

本章学习目标

  • 能安装并配置 matplotlib 的中文字体与主题
  • 能用 matplotlib 画折线、柱状、散点、直方图并设置标注
  • 能用 seaborn 快速做统计类图表(箱线图、热力图、回归图)
  • 能用 pyecharts 输出可交互的 HTML 图表

本章导览

核心内容

8.1

环境与中文显示

PYTHON
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

四类基础图

PYTHON
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

常用美化与多子图

PYTHON
# 多子图: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:统计图更快

PYTHON
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:输出可交互图表

PYTHON
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')      # 生成可直接打开的 HTML
pyecharts 生成的是 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 便于分享。