Python Matplotlib八大常用图表绘制实战:从折线图到三维曲面

栗子
栗子
发布时间:2026-10-12| 2人浏览过
原创

本文详解Python中Matplotlib库的八大核心图表绘制方法,涵盖折线图、柱状图、饼图、直方图、极轴饼图、三维散点图及三维曲面图。提供环境配置、中文字体设置及完整可运行代码,帮助开发者快速掌握数据可视化技能,适用于趋势分析、数值对比及多维数据展示场景。

前言

数据可视化在数据分析流程中占据核心地位,而Matplotlib作为Python生态中最基础且功能强大的绘图库,是实现这一目标的关键工具。本文将以一段典型的可视化代码为基础,逐行解析8种常用图表的绘制逻辑与实现细节,具体包括:

  • 折线图
  • 柱形图(含并列柱状图)
  • 饼图
  • 直方图
  • 极轴饼图(雷达图变体)
  • 三维散点图
  • 三维曲面图

一、环境准备与通用设置

安装依赖

pip install matplotlib numpy

中文字体与负号显示

Matplotlib默认配置下不支持中文字符显示,且负号可能显示为方块,因此需要手动设置字体并修正负号渲染问题:

plt.rcParams["font.sans-serif"] = ["SimHei"]   # 使用黑体
plt.rcParams["axes.unicode_minus"] = False    # 正常显示负号

二、效果展示

三、完整代码

# -*- coding: utf-8 -*-
# 安装所需模块 
# pip install matplotlib
# pip install numpy
'''Python绘制八种可视化常用的图表'''
import numpy as np
import matplotlib.pyplot as plt
import random
from mpl_toolkits.mplot3d import Axes3D
'''折线图绘制'''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
x = np.linspace(1, 2, 100)
for i in range(len(x_data)):
	plt.plot(x, x**(i+1), label=x_data[i])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 设置x轴标签名
plt.xlabel('笔记分类')
# 设置y轴标签名
plt.ylabel('关注度')
# 设置图片名称
plt.title("折线图绘制")
plt.legend()
plt.show()
''' 柱形图绘制 '''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
y_data = [963,344,107,236,587,312,1263,963,105,453,363,163]
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
for i in range(len(x_data)):
    plt.bar(x_data[i], y_data[i])
    plt.text(x_data[i], y_data[i], y_data[i], ha="center", va="bottom", fontsize=12)
# 设置图片名称
plt.title("柱形图绘制")
# 设置x轴标签名
plt.xlabel("笔记分类")
# 设置y轴标签名
plt.ylabel("关注度")
plt.show()
''' 并列柱状图绘制 '''
size = 5
# 返回size个0-1的随机数
a = np.random.random(size)
b = np.random.random(size)
c = np.random.random(size)
# x轴坐标, size=5, 返回[0, 1, 2, 3, 4]
x = np.arange(size)
# 有a/b/c三种类型的数据,n设置为3
total_width, n = 0.8, 3
# 每种类型的柱状图宽度
width = total_width / n
# 重新设置x轴的坐标
x = x - (total_width - width) / 2
# 画柱状图
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.bar(x, a, width=width, label="a")
plt.bar(x + width, b, width=width, label="b")
plt.bar(x + 2*width, c, width=width, label="c")
# 功能1
x_labels = ["第1组", "第2组", "第3组", "第4组", "第5组"]
# 用第1组...替换横坐标x的值
plt.xticks(x, x_labels)
# 功能2
for i, j in zip(x, a):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
for i, j in zip(x + width, b):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
for i, j in zip(x + 2 * width, c):
    plt.text(i, j + 0.01, "%.2f" % j, ha="center", va="bottom", fontsize=12)
# 显示图例
plt.legend()
# 显示柱状图
plt.title("并列柱状图绘制")
plt.show()
''' 饼图绘制 '''
x_data = ['职场','美食','摄影','情感','艺术','影视','穿搭','绘画','搞笑','游戏','动漫','音乐']
y_data = [963,344,107,236,587,312,1263,963,105,453,363,163]
explode = [0, 0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0]
# 设置图片名称
plt.title('饼图绘制')
# 画饼图方法
plt.pie(y_data,explode=explode,labels=x_data,shadow=True,autopct='%1.1f%%')
# 显示
plt.show()
'''直方图绘制'''
np.random.seed(19680801)
mu1, sigma1 = 100, 15
mu2, sigma2 = 80, 15
x1 = mu1 + sigma1 * np.random.randn(10000)
x2 = mu2 + sigma2 * np.random.randn(10000)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# density:是密度而不是具体数值
n1, bins1, patches1 = plt.hist(x1, 50, density=True, facecolor='g', alpha=1)
n2, bins2, patches2 = plt.hist(x2, 50, density=True, facecolor='r', alpha=0.2)
plt.xlabel('X')
# 设置y轴标签名
plt.ylabel('Y')
# 设置图片名称
plt.title("直方图绘制")
plt.text(110, .025, r'$\mu=100,\ \sigma=15$')
plt.text(50, .025, r'$\mu=80,\ \sigma=15$')
# 设置x,y轴的具体范围
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
'''极轴饼图绘制'''
np.random.seed(19680801)
N = 10
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
ax = plt.subplot(111, projection='polar')
bars = ax.bar(theta, radii, width=width, bottom=0.0)
# left表示从哪开始,
# radii表示从中心点向边缘绘制的长度(半径)
# width表示末端的弧长
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 自定义颜色和不透明度
for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.5)
# 设置图片名称
plt.title("极轴饼图绘制")
plt.show()
'''三维散点图绘制'''
data = np.random.randint(0, 255, size=[40, 40, 40])
x, y, z = data[0], data[1], data[2]
ax = plt.subplot(111, projection='3d')  # 创建一个三维的绘图工程
#  将数据点分成三部分画,在颜色上有区分度
ax.scatter(x[:10], y[:10], z[:10], c='y')  # 绘制数据点
ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
ax.scatter(x[30:40], y[30:40], z[30:40], c='g')
ax.set_zlabel('Z')  # 坐标轴
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.title("三维散点图绘制")
plt.show()
'''三维平面图绘制'''
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 具体函数方法可用 help(function) 查看,如:help(ax.plot_surface)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.title("三维平面图绘制")
plt.show()

四、总结与建议

通过上述8个实例,本文覆盖了Matplotlib中最常用的图表类型。在实际应用中,建议根据数据的具体特征(如趋势、分布、占比或三维关系)选择最合适的图表类型,以确保信息传达的准确性与直观性:

图表类型适用场景
折线图趋势变化
柱形图数值对比
并列柱状图多组对比
饼图占比分布
直方图频率分布
极轴饼图环形/角度数据
三维散点图三维聚类
三维曲面图数学函数/地形可视化

以上就是Python中八种常用的可视化图表绘制完整代码的详细内容,更多关于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 算法库。