Python 数据可视化实战入门教程

Python 数据可视化实战入门教程

作者:wcy

适用人群:已学完 Python 3 基础与《Python Pandas 数据处理实战教程》,想用图表展示数据规律与报表的初学者

版本说明:本教程基于 Python 3 (3.8+ 通用),核心库 matplotlib


目录

  1. 本教程定位
  2. [matplotlib 是什么](#matplotlib 是什么)
  3. 环境准备
  4. 第一个图
  5. 折线图
  6. 柱状图
  7. 饼图
  8. 散点图
  9. 直方图
  10. 标题与图例标签
  11. 颜色与样式
  12. 多子图
  13. 中文显示
  14. 保存图片
  15. [实战一:把 Pandas 数据画成图表](#实战一:把 Pandas 数据画成图表)
  16. 实战二:销售综合分析图
  17. 小结与练习

1. 本教程定位

上一篇用 Pandas 算出了三张销售报表------可老板不看数字,要看图。一张柱状图胜过三行表格。matplotlib 是 Python 最经典的绘图库,能画折线、柱状、饼、散点、直方等几乎所有图表。

本教程解决四类问题:

  1. 画什么:折线/柱状/饼/散点/直方分别适合什么数据?
  2. 怎么画:每种图的完整代码长什么样?
  3. 怎么美化:标题、轴标签、图例、刻度、颜色、网格怎么配?
  4. 怎么落地:多图拼版、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 栅格,小 照片类
PDF 矢量 打印/论文
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 课后练习

  1. 基础:画 2026 年前 6 个月两产品销售额折线对比图(自己造数据),加图例、网格、标题。
  2. 柱状:把上一题的 6 个月数据画成分组柱状图,并给每根柱子加数值标签。
  3. 占比:统计你最近一个月各 app 使用时长占比,画饼图并让最大的那块凸出。
  4. 关系:收集 20 个城市"温度 vs 冰淇淋销量"假数据,画散点图判断相关方向。
  5. 分布:生成 3 组不同标准差的正态数据(各 500 点),直方图叠加对比并加透明度。
  6. 中文:造一张含中文标题、中文刻度、负数的图,验证中文显示与负号正常。
  7. 多子图:把练习 1~4 的四张图拼成 2×2 仪表盘并保存 PNG。
  8. 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 原生接口。


相关推荐
蜗牛互联网1 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
SL_staff1 小时前
当规则引擎开始‘懂业务’:JVS-Rules金融风控四大原生能力拆解
java·python·全栈
蚰蜒螟2 小时前
从内核启动到 Java NIO:一次 socket accept 的源码串联之旅
java·python·nio
学逆向的2 小时前
C 突破编译器限制
c语言·开发语言·网络安全
jimy13 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
高洁013 小时前
AI赋能产业升级与中美未来经济赛道博弈
人工智能·python·深度学习·机器学习·transformer
爱吃提升3 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
夜晚回家3 小时前
Python 原始字符串详解 | r 前缀到底让什么不再转义
开发语言·python
陈年老古董3 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm