当前位置: 首页 > news >正文

Matplotlib - Python图表可视化利器

作者:唐叔在学习
专栏:唐叔学python
标签:Python可视化、Matplotlib教程、数据可视化、Python数据分析、机器学习可视化、科研绘图、Python图表、大数据可视化、Python入门、AI可视化

文章目录

    • 一、Matplotlib是什么?为什么它如此重要?
    • 二、Matplotlib安装与基础配置
      • 2.1 安装Matplotlib
      • 2.2 基础配置
      • 2.3 基本代码样式
    • 三、12种必学图表类型详解
      • 3.1 折线图 - 趋势分析利器
      • 3.2 柱状图 - 对比分析神器
      • 3.3 散点图 - 相关性分析法宝
      • 3.4 饼图 - 占比分析必备
      • 3.5 直方图 - 分布分析专家
      • 3.6 箱线图 - 异常值检测高手
      • 3.7 热力图 - 矩阵数据可视化
      • 3.8 面积图 - 累积效果展示
      • 3.9 极坐标图 - 周期性数据展示
      • 3.10 3D图表 - 立体数据展示
      • 3.11 等高线图 - 二维标量场可视化
      • 3.12 组合图表 - 复杂可视化
    • 四、Matplotlib高级技巧
      • 4.1 子图布局
      • 4.2 动画制作
      • 4.3 自定义样式
    • 五、总结与学习建议


一、Matplotlib是什么?为什么它如此重要?

各位小伙伴们好,我是唐叔!今天咱们来聊聊Python可视化界的"扛把子"——Matplotlib。

Matplotlib 是Python中最基础、最经典的可视化库,由John D. Hunter于2003年创建。它就像是数据科学家的"画笔",能够将枯燥的数据转化为直观的图表。在数据科学、机器学习、科研等领域,Matplotlib几乎是标配工具。

为什么我强烈推荐学习Matplotlib?三个理由:

  1. 兼容性强:与NumPy、Pandas无缝集成
  2. 功能全面:从简单折线图到复杂3D图表应有尽有
  3. 社区强大:遇到问题随时能找到解决方案
import matplotlib.pyplot as plt
import numpy as np# 最简单的例子
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.title("我的第一个Matplotlib图表")
plt.show()

在这里插入图片描述

二、Matplotlib安装与基础配置

2.1 安装Matplotlib

pip install matplotlib
# 或者使用conda
conda install matplotlib

2.2 基础配置

唐叔小技巧:在Jupyter Notebook中使用以下魔法命令,让图表显示更美观:

%matplotlib inline
plt.style.use('seaborn')  # 使用更现代的样式
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

2.3 基本代码样式

下述是基本的代码样式:

import numpy as np
import matplotlib.pyplot as plt# 模拟数据
x = np.arange(0, 5, 0.1)
y = np.sin(x)# plt.具体表(x, y [,other])
plt.plot(x, y)# 展示图表
plt.show()

三、12种必学图表类型详解

3.1 折线图 - 趋势分析利器

import matplotlib.pyplot as plt# 股票价格趋势示例
days = [1, 2, 3, 4, 5]
price = [23.5, 24.1, 23.9, 25.2, 26.0]plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题plt.plot(days, price, marker='o', linestyle='--', color='r')
plt.xlabel("日期")
plt.ylabel("价格(元)")
plt.title("某股票五日价格趋势")
plt.grid(True)
plt.show()

在这里插入图片描述

3.2 柱状图 - 对比分析神器

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 各大城市平均薪资对比
cities = ['北京', '上海', '深圳', '广州', '杭州']
salaries = [25000, 23000, 22000, 18000, 20000]
plt.bar(cities, salaries, color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd'])
plt.title("2023年各大城市IT平均薪资")
plt.ylabel("薪资(元)")
plt.show()

在这里插入图片描述

3.3 散点图 - 相关性分析法宝

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 身高体重相关性分析
np.random.seed(42)
height = np.random.normal(170, 10, 100)
weight = height * 0.6 + np.random.normal(0, 5, 100)
plt.scatter(height, weight, alpha=0.6, edgecolors='w')
plt.xlabel("身高(cm)")
plt.ylabel("体重(kg)")
plt.title("身高体重相关性分析")
plt.show()

在这里插入图片描述

3.4 饼图 - 占比分析必备

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 手机市场份额
brands = ['苹果', '华为', '小米', 'OPPO', 'vivo', '其他']
share = [25, 20, 18, 15, 12, 10]
explode = (0.1, 0, 0, 0, 0, 0)  # 突出显示第一块
plt.pie(share, explode=explode, labels=brands, autopct='%1.1f%%', shadow=True)
plt.title("2023年中国智能手机市场份额")
plt.show()

在这里插入图片描述

3.5 直方图 - 分布分析专家

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 学生成绩分布
scores = np.random.normal(75, 12, 1000)
plt.hist(scores, bins=20, edgecolor='black')
plt.xlabel("分数")
plt.ylabel("人数")
plt.title("高三(1)班模拟考成绩分布")
plt.show()

在这里插入图片描述

3.6 箱线图 - 异常值检测高手

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 各地区房价对比
data = [np.random.normal(50000, 10000, 100),np.random.normal(60000, 8000, 100),np.random.normal(45000, 12000, 100)]
plt.boxplot(data, labels=['朝阳区', '海淀区', '丰台区'])
plt.ylabel("房价(元/平米)")
plt.title("北京市各区房价分布")
plt.show()

在这里插入图片描述

3.7 热力图 - 矩阵数据可视化

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 相关系数矩阵
data = np.random.rand(10, 10)
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title("相关系数热力图")
plt.show()

在这里插入图片描述

3.8 面积图 - 累积效果展示

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 各季度销售额累积
x = ['Q1', 'Q2', 'Q3', 'Q4']
y1 = [120, 140, 160, 180]  # 产品A
y2 = [80, 100, 120, 150]   # 产品B
plt.stackplot(x, y1, y2, labels=['产品A', '产品B'])
plt.legend(loc='upper left')
plt.title("2023年各季度销售额累积")
plt.show()

在这里插入图片描述

3.9 极坐标图 - 周期性数据展示

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 雷达图展示技能点
categories = ['Python', 'SQL', '机器学习', '统计学', '沟通能力']
values = [90, 85, 80, 75, 70]
angles = np.linspace(0, 2*np.pi, len(categories), endpoint=False)
values = np.concatenate((values,[values[0]]))
angles = np.concatenate((angles,[angles[0]]))
plt.polar(angles, values, marker='o')
plt.fill(angles, values, alpha=0.25)
plt.thetagrids(angles[:-1] * 180/np.pi, categories)
plt.title("数据科学家技能雷达图")
plt.show()

在这里插入图片描述

3.10 3D图表 - 立体数据展示

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 3D散点图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
z = np.random.normal(0, 1, 100)
ax.scatter(x, y, z, c='r', marker='o')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
plt.title("3D散点图示例")
plt.show()

在这里插入图片描述

3.11 等高线图 - 二维标量场可视化

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 函数可视化
def f(x, y):return np.sin(np.sqrt(x**2 + y**2))x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar()
plt.title("函数$sin(√(x^2+y^2))$的等高线图")
plt.show()

在这里插入图片描述

3.12 组合图表 - 复杂可视化

import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 组合折线图和柱状图
fig, ax1 = plt.subplots()
x = ['1月', '2月', '3月', '4月', '5月']
sales = [120, 150, 130, 200, 180]
profit_rate = [0.15, 0.18, 0.12, 0.20, 0.16]ax1.bar(x, sales, color='b', alpha=0.6)
ax1.set_xlabel('月份')
ax1.set_ylabel('销售额(万元)', color='b')
ax1.tick_params(axis='y', labelcolor='b')ax2 = ax1.twinx()
ax2.plot(x, profit_rate, 'r-o')
ax2.set_ylabel('利润率', color='r')
ax2.tick_params(axis='y', labelcolor='r')plt.title("2023年1-5月销售情况分析")
plt.show()

在这里插入图片描述

四、Matplotlib高级技巧

4.1 子图布局

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 2x2子图布局
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
axs[0, 0].plot(np.random.rand(10))
axs[0, 0].set_title('随机折线图')
axs[0, 1].scatter(np.random.rand(10), np.random.rand(10))
axs[0, 1].set_title('随机散点图')
axs[1, 0].bar(['A', 'B', 'C'], [3, 7, 2])
axs[1, 0].set_title('简单柱状图')
axs[1, 1].pie([30, 20, 50], labels=['X', 'Y', 'Z'])
axs[1, 1].set_title('饼图示例')
plt.tight_layout()
plt.show()

在这里插入图片描述

4.2 动画制作

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimationplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 正弦波动画
fig, ax = plt.subplots()
x = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x, np.sin(x))def update(frame):line.set_ydata(np.sin(x + frame/10))return line,ani = FuncAnimation(fig, update, frames=100, interval=50)
plt.title("动态正弦波")
plt.show()

在这里插入图片描述

4.3 自定义样式

import matplotlib.pyplot as plt
import numpy as npplt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题# 使用自定义样式
plt.style.use('ggplot')
x = np.arange(10)
plt.plot(x, x**2, 'b-', label='平方')
plt.plot(x, x**3, 'r--', label='立方')
plt.legend()
plt.title("自定义样式示例")
cParams['axes.unicode_minus'] = False  # 解决负号显示问题# 使用自定义样式
plt.style.use('ggplot')
x = np.arange(10)
plt.plot(x, x**2, 'b-', label='平方')
plt.plot(x, x**3, 'r--', label='立方')
plt.legend()
plt.title("自定义样式示例")
plt.show()

在这里插入图片描述

五、总结与学习建议

通过本文,唐叔带你系统学习了Matplotlib的12种核心图表类型和3个高级技巧。记住:

  1. 基础图表是根本,折线图、柱状图、散点图必须熟练掌握
  2. 高级图表如3D图、热力图能让你在特定场景下表现更专业
  3. 组合使用各种图表类型能产生更丰富的数据洞察

学习建议

  • 先掌握基础图表,再逐步学习高级功能
  • 多动手实践,从简单的数据集开始
  • 参考官方文档和优秀案例(如Seaborn的源码)

Matplotlib虽然学习曲线略陡峭,但一旦掌握,你就能随心所欲地让数据"说话"。记住唐叔的话:“数据可视化不是目的,而是发现数据价值的手段。”

最后送大家一个学习福利:关注唐叔的CSDN账号,回复"Matplotlib"获取本文所有源码和更多实战案例!


往期Python文章推荐

✅ Tkinter - Python图形界面开发指南
✅ Pandas - Python爬虫数据处理分析神器
✅ Pandas - JSON格式数据操作实践
✅ 告别Python环境依赖!用PyInstaller打包EXE的终极指南

http://www.dtcms.com/a/311146.html

相关文章:

  • Vue3核心语法进阶(computed与监听)
  • 除数博弈(动态规划)
  • cs336之注意pytorch的tensor在哪里?(assert的使用)
  • vue3渲染html数据并实现文本修改
  • 【7.5 Unity AssetPostprocessor】
  • 大模型 + 垂直场景:搜索 / 推荐 / 营销 / 客服领域开发有哪些新玩法?
  • Flask 框架全面详解
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • MyBatis与MySQL
  • 【安装教程】Docker Desktop 安装与使用教程
  • 从毫秒到真义:构建工业级RAG系统的向量检索优化指南
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • (思维)洛谷 P13551 ももいろの鍵 题解
  • 位菜:仪式锚与价值符
  • 24黑马SpringCloud的Docker本地目录挂载出现相关问题解决
  • 【图像处理基石】用Python实现基础滤镜效果
  • LLM中Function Call的原理及应用
  • 工业仪表盘识别误检率↓79%!陌讯多模态融合算法在设备巡检中的落地优化​
  • 安全光幕Muting功能程序逻辑设计
  • [mssql] 分析SQL Server中执行效率较低的SQL语句
  • Git、Gitee、GitHub、GitLab完整讲解:从基础到进阶
  • GaussDB 约束的使用举例
  • Leetcode-141.环形链表
  • Rust: 工具链版本更新
  • Linux网络-------4.传输层协议UDP/TCP-----原理
  • Ajax——异步前后端交互提升OA系统性能体验
  • python chardet文本编码识别代码
  • Java单元测试和设计模式
  • uniapp 富文本rich-text 文本首行缩进和图片居中
  • Day 29: 复习