Python数据可视化教程_Matplotlib绘图基础与案例

Matplotlib绘图应优先使用面向对象方式:先创建Figure,再获取Axes对象,所有绘图及设置操作均在ax上完成;核心在于理解Figure→Axes→Artist层级和OO与pyplot两种接口风格。

Matplotlib 是 Python 最成熟、最常用的二维绘图库,掌握其基础语法和常见绘图逻辑,就能快速将数据转化为清晰、专业的图表。重点不在记住所有参数,而在于理解“对象层级结构”(Figure → Axes → Artist)和“两种接口风格”(面向对象 vs pyplot 简写),再配合实际需求组合使用。

核心绘图流程:从 figure 到 plot

推荐始终使用面向对象(OO)方式,代码更可控、易复用、适合复杂图表:

  • 先调用 plt.figure() 创建画布(Figure),可指定大小、DPI 等
  • 再用 fig.add_subplot(111)plt.subplots() 获取坐标轴对象(Axes)——这才是真正绘图的“画板”
  • 所有绘图操作(如 ax.plot()ax.scatter()ax.bar())都作用于这个 ax 对象
  • 设置标题、标签、图例等也通过 ax 的方法完成,例如 ax.set_title()ax.legend()

常用图表类型与关键参数

不同图表关注的数据关系不同,参数侧重也不同:

  • 折线图(plot):强调趋势。注意 marker(标记点形状)、linestyle(线型)、color(颜色)可直接传字符串如 'ro--'(红色圆点+虚线)
  • 散点图(scatter):强调分布与相关性。用 c 参数映射第三维(如数值大小或类别),配合 cmap 设置颜色映射
  • 柱状图(bar / barh):强调分类对比。注意 width 控制柱宽,align='center' 是默认对齐方式;多组柱状图需手动调整 x 坐标偏移
  • 直方图(hist):观察数值分布。关键在 bins(分组数)和 density=True(归一化为概率密度)

让图表更专业:标签、图例与布局

默认样式往往不够清晰,几处调整立竿见影:

  • 坐标轴标签用 ax.set_xlabel()ax.set_ylabel(),字体大小可用 fontsize=12
  • 中文显示需提前设置字体:加入 plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans'] 并关闭负号异常:plt.rcParams['axes.unicode_minus'] = False
  • 图例位置不遮挡数据:用 ax.legend(loc='upper right'),或更灵活的 bbox_to_anchor=(1.05, 1) 移到图外
  • 子图紧凑排布:绘图后调用 plt.tight_layout() 自动调整间距,避免标签被截断

一个完整案例:销售数据趋势+分布双视图

用一份模拟月度销售额数据,同时展示趋势(折线)和分布特征(直方图):

(代码示意,非可运行全量)

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
# 上图:月度趋势
ax1.plot(months, sales, 'b-o', linewidth=2, markersize=4)
ax1.set_ylabel('销售额(万元)')
ax1.grid(True, alpha=0.3)

下图:分布直方图

ax2.hist(sales, bins=8, color='lightcoral', edgecolor='darkred', alpha=0.7) ax2.set_xlabel('销售额区间') ax2.set_ylabel('频次') ax2.grid(True, alpha=0.3)

plt.tight_layout() plt.show()