Python使用Matplotlib绘制基础可视化图表的完整指南

林见深
林见深
发布时间:2026-10-10| 3人浏览过
原创

本文详解如何利用Python Matplotlib库快速生成折线图、柱状图、饼图、散点图、直方图、箱线图、热力图与雷达图。涵盖环境配置、核心API调用、关键参数调整及异常排查,提供可直接运行的代码模板与结果对照,助您高效完成数据可视化项目。

环境与前提准备

在编写可视化脚本前,需确保本地已安装基础绘图库。对于纯Matplotlib原生图表,直接安装主库即可;若涉及热力图等高级渲染,需额外获取seaborn与数据处理依赖。

# 安装基础可视化库
pip install matplotlib

# 安装热力图专属依赖(可选)
pip install seaborn numpy pandas

所有图表默认使用英文字体,会导致中文坐标轴或标题显示为方块。在任意脚本顶部执行以下全局配置,可统一解决排版问题并正确渲染负号:

import matplotlib.pyplot as plt

# Windows默认黑体,Mac请将 SimHei 替换为 PingFang SC
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

基础图表绘制实战

第1步:绘制趋势折线图

目的:展示数据随时间或有序类别的变化轨迹。入口:导入matplotlib.pyplot并准备时序X轴与数值Y轴列表。动作:调用plt.plot()绑定两组数据。重要参数:设置marker="o"高亮数据点,color指定线条色彩,linewidth控制线宽,结合plt.grid(True)添加参考网格。完成状态:执行后弹出画布,可见带有圆点标记与横向虚线网格的连续曲线,顶栏图例与实际数据序列一一对应。

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [78, 85, 74, 95, 84, 80]

plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="blue", linewidth=2, label="销售额")
plt.title("上半年销售额趋势")
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.legend()
plt.grid(True, linestyle="--", alpha=0.5)
plt.show()
带网格线与圆点标记的月度销售趋势折线图

第2步:构建对比柱状图

目的:直观比较不同独立分类之间的数值差异。入口:准备类别名称数组与对应数量数组。动作:使用plt.bar()生成垂直矩形条。重要参数:width=0.6调整柱子宽度比例,color填充主题色;循环枚举数据调用plt.text()在顶端追加数值标签。完成状态:输出包含等距排列矩形的对比视图,每个柱子顶部悬浮精确数字,整体布局紧凑易读。

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

products = ["手机", "电脑", "耳机", "平板", "手表"]
sales = [78, 85, 74, 95, 84]

plt.figure(figsize=(8, 5))
plt.bar(products, sales, color="orange", width=0.6)

for index, value in enumerate(sales):
    plt.text(index, value + 10, str(value), ha="center")

plt.title("不同产品销量对比")
plt.xlabel("产品")
plt.ylabel("销量")
plt.show()
带顶部数值标签的五类产品销量对比柱状图

第3步:展示占比饼图

目的:呈现各分项占总体的百分比构成。入口:定义扇区对应的标签组与原始权重值。动作:传入plt.pie()进行环形/扇形分割。重要参数:autopct="%.1f%%"自动计算并格式化百分比,startangle=90逆时针旋转起始边界,counterclock=False按顺时针展开。完成状态:画面呈现完整圆形分割图,每个扇区外侧附带黄色百分比读数,顶部居中标题说明数据含义。

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

channels = ["搜索引擎", "短视频", "社交媒体", "直接访问", "邮件"]
users = [1000, 500, 300, 400, 200]

plt.figure(figsize=(7, 7))
plt.pie(
    users,
    labels=channels,
    autopct="%.1f%%",
    startangle=90,
    counterclock=False
)
plt.title("用户来源占比")
plt.show()
带百分比标注的五渠道用户来源饼图

第4步:分析相关性散点图

目的:探索两个连续变量之间的分布形态与潜在相关性。入口:利用numpy生成模拟样本,划分自变量与因变量序列。动作:调用plt.scatter()将坐标映射至二维平面。重要参数:alpha=0.7控制点透明度以防遮挡,edgecolors="black"勾勒轮廓增强层次。完成状态:渲染结果为布满云状的点阵分布,可通过点的聚集方向判断正相关或负相关趋势。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

np.random.seed(42)
study_hours = np.random.uniform(1, 8, 100)
scores = study_hours * 8 + 40 + np.random.normal(0, 5, 100)

plt.figure(figsize=(8, 5))
plt.scatter(study_hours, scores, color="skyblue", edgecolors="black", alpha=0.7)
plt.title("学习时长与考试成绩的关系", fontsize=14)
plt.xlabel("每日学习时长 (小时)")
plt.ylabel("考试成绩 (分)")
plt.grid(True, linestyle="--", alpha=0.5)
plt.show()
呈正相关趋势分布的学生成绩散点图

第5步:查看分布直方图

目的:刻画单一连续变量的频率密度与区间跨度。入口:导入大量符合特定分布的样本数据。动作:使用plt.hist()自动进行数值分箱统计。重要参数:bins=30设定切割区间数量,edgecolor="black"加粗柱体边界,alpha=0.7保持通透感。完成状态:输出近似钟形曲线的阶梯状图,横轴为度量范围,纵轴为落入该区间的频数。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

np.random.seed(42)
heights = np.random.normal(175, 7, 1000)

plt.figure(figsize=(8, 5))
plt.hist(heights, bins=30, color="mediumseagreen", edgecolor="black", alpha=0.7)
plt.title("成年男性身高分布情况", fontsize=14)
plt.xlabel("身高 (cm)")
plt.ylabel("人数")
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.show()
展示正态分布特征的男学生身高直方图

第6步:统计箱线图

目的:对比多组数据的四分位数、离散程度与极端异常值。入口:将多个独立样本打包为嵌套列表结构。动作:通过plt.boxplot()解析统计量并绘制箱体结构。重要参数:patch_artist=True启用颜色填充,boxprops与medianprops分别定制箱体边框与中位线样式。完成状态:生成包含须线、箱体与中线标记的多组几何图形,便于快速识别各组均值偏移与数据波动范围。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

np.random.seed(42)
class_A = np.random.normal(75, 10, 100)
class_B = np.random.normal(80, 8, 100)
class_C = np.random.normal(70, 12, 100)

data_to_plot = [class_A, class_B, class_C]
labels = ["A班", "B班", "C班"]

plt.figure(figsize=(8, 5))
plt.boxplot(data_to_plot, labels=labels, patch_artist=True,
            boxprops=dict(facecolor="lightcoral", color="black"),
            medianprops=dict(color="white"))
plt.title("三个班级数学成绩分布对比", fontsize=14)
plt.ylabel("数学成绩")
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.show()
含须线与中位标识的多班级成绩箱线图

进阶多维与组合图表

第7步:生成热力图

目的:以颜色梯度映射二维矩阵中的数值大小,定位高频交互区域。入口:借助pandas.DataFrame构建行列索引完整的二维表。动作:调用seaborn.heatmap()接管底层渲染逻辑。重要参数:cmap="YlOrRd"应用黄橙红色阶,cbar_kws自定义右侧颜色棒标签。完成状态:输出充满渐变色块的矩阵网格,亮度越高代表订单量越密集,适合监控周期性业务峰值。

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

np.random.seed(42)
days = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
hours = [f"{h}点" for h in range(24)]
orders = np.random.randint(10, 100, size=(7, 24))
orders[5:, 18:23] += 50

df = pd.DataFrame(orders, index=days, columns=hours)

plt.figure(figsize=(14, 6))
sns.heatmap(df, annot=False, fmt="d", cmap="YlOrRd", cbar_kws={'label': '订单量'})
plt.title("一周内每小时订单量热力图", fontsize=14)
plt.xlabel("时间")
plt.ylabel("星期")
plt.show()
展示周末晚间高峰期的电商订单热力图

第8步:构建雷达图

目的:在同一极坐标下同步评估多个维度的相对强度。入口:准备维度名称列表与各项得分数组。动作:利用subplot_kw=dict(polar=True)切换坐标系,通过三角函数计算角度均分圆周。重要参数:手动拼接首尾元素闭合多边形,ax.fill()填充半透明区域,ax.set_ylim()规范能力刻度范围。完成状态:绘制出放射状连线构成的封闭多边形区域,不同角色数据层叠分明,直观反映能力倾斜倾向。

import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

categories = ["攻击", "防御", "速度", "耐力", "技术", "策略"]
num_vars = len(categories)

stats_A = [85, 90, 70, 88, 75, 80]
stats_B = [95, 60, 92, 65, 88, 70]

angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
stats_A += stats_A[:1]
stats_B += stats_B[:1]
angles += angles[:1]

fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
ax.plot(angles, stats_A, color="blue", linewidth=2, linestyle="solid", label="角色 A")
ax.fill(angles, stats_A, color="blue", alpha=0.2)
ax.plot(angles, stats_B, color="red", linewidth=2, linestyle="solid", label="角色 B")
ax.fill(angles, stats_B, color="red", alpha=0.2)

ax.set_ylim(0, 100)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, size=12)
plt.legend(loc="upper right", bbox_to_anchor=(1.3, 1.1))
plt.title("游戏角色六维能力对比雷达图", size=16, pad=20)
plt.show()
展示双角色攻防速度差异的极坐标雷达图

常见问题与排错

  • 中文乱码:若运行后标题或坐标轴显示为□,请检查系统是否已安装对应字体文件,或将SimHei替换为系统内置字体(如Arial Unicode MS或PingFang SC)。
  • 图片不显示:未调用plt.show()或脚本被后台阻塞导致UI线程卡死。在Jupyter环境中请使用%matplotlib inline替代弹出式交互。
  • 热力图空白/报错:确认已升级Pandas至1.5+版本,且输入的矩阵不包含非数值型字符。若annot=True导致性能卡顿,建议在大数据量时关闭文本注解。

简要总结

掌握Matplotlib的核心在于理解面向对象接口与Pyplot状态的切换,熟练运用figure初始化画布、axis控制坐标属性、legend/grid完善辅助信息。上述八类图表覆盖了绝大多数业务汇报与科研分析场景,配合参数微调即可产出出版级视觉效果。以上就是Python使用Matplotlib绘制基础可视化图表的详细内容,更多关于Python数据分析与可视化的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。