深入Matplotlib:画布分区与高级图形展示【第33篇—python:Matplotlib】

文章目录

  • Matplotlib画布分区技术详解
    • 引言
    • 方法一:plt.subplot()
    • 方法二:简略写法
    • 方法三:plt.subplots()
    • 实例展示
    • 添加更多元素
  • 进一步探索Matplotlib画布分区
    • 自定义子图布局
    • 3D子图
    • 结语

Matplotlib画布分区技术详解

引言

Matplotlib是一个强大的Python绘图库,通过其灵活的画布分区技术,用户可以在一个画布上创建多个子图,以更清晰地呈现数据图形。本文将深入介绍Matplotlib中的画布分区方法,并通过实例演示如何在子图中展示不同类型的数据。

方法一:plt.subplot()

首先,我们使用plt.subplot()方法来实现画布分区。以下是示例代码:

import matplotlib.pyplot as plt
import numpy as np# 将画布分为2行2列,将图画到画布的指定区域
x = np.linspace(1, 10, 100)plt.subplot(2, 2, 1)
plt.plot(x, np.sin(x))plt.subplot(2, 2, 3)
plt.plot(x, np.cos(x))plt.show()

在这段代码中,我们选择了画布的第一个区域作为当前子图,并在该子图中绘制了正弦曲线。通过类似的方式,我们在第三个子图中绘制了余弦曲线。
在这里插入图片描述

方法二:简略写法

第二种方法是方法一的简略写法,只需去掉逗号即可:

import matplotlib.pyplot as plt
import numpy as np# 将画布分为2行2列,将图画到画布的指定区域
x = np.linspace(1, 10, 100)plt.subplot(221)
plt.plot(x, np.sin(x))plt.subplot(223)
plt.plot(x, np.cos(x))plt.show()

方法三:plt.subplots()

第三种方法通过plt.subplots()创建包含多个子图的画布,并返回子图对象的元组:

import matplotlib.pyplot as plt
import numpy as np# 将画布分为2行2列,创建子图对象
x = np.linspace(1, 10, 100)fig, ax = plt.subplots(nrows=2, ncols=2)ax[0][1].plot(x, np.sin(x))
ax[1][1].plot(x, np.cos(x))plt.show()

这种方法返回了一个包含子图对象的元组 (fig, ax),通过 ax 对象可以选择和操作不同的子图区域。
在这里插入图片描述

实例展示

通过一个实际的例子,结合Matplotlib的画布分区,展示如何绘制多个子图,并在每个子图中展示不同的数据:

import matplotlib.pyplot as plt
import numpy as np# 生成一些虚构的数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = x**2
y4 = np.exp(x)# 创建画布并分为2行2列
fig, ax = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))ax[0][0].plot(x, y1, color='blue', label='sin(x)')
ax[0][1].plot(x, y2, color='green', label='cos(x)')
ax[1][0].plot(x, y3, color='orange', label='x^2')
ax[1][1].plot(x, y4, color='red', label='exp(x)')# 添加标题和图例
for i in range(2):for j in range(2):ax[i][j].set_title(['Sine Curve', 'Cosine Curve', 'Quadratic Curve', 'Exponential Curve'][i * 2 + j])ax[i][j].legend()plt.tight_layout()
plt.show()

在这个例子中,我们展示了如何在一个画布上展示多个子图,每个子图中绘制不同类型的数据,并通过标题和图例使图形更加清晰。

添加更多元素

最后,我们展示了如何在子图中添加更多的元素,例如坐标轴标签、网格线和自定义颜色、样式:

import matplotlib.pyplot as plt
import numpy as npx = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)fig, ax = plt.subplots(nrows=2, ncols=1, figsize=(8, 8))# 子图1
ax[0].plot(x, y1, color='blue', label='sin(x)', linestyle='--', linewidth=2)
ax[0].set_title('Sine Curve')
ax[0].legend()
ax[0].grid(True, linestyle=':', alpha=0.7)
ax[0].set_xlabel('X-axis')
ax[0].set_ylabel('Y-axis')# 子图2
ax[1].plot(x, y2, color='green', label='cos(x)', linestyle='-', linewidth=2)
ax[1].set_title('Cosine Curve')
ax[1].legend()
ax[1].grid(True, linestyle=':', alpha=0.7)
ax[1].set_xlabel('X-axis')
ax[1].set_ylabel('Y-axis')plt.tight_layout()
plt.show()

在这个例子中,我们通过添加标题、标签、网格线和坐标轴标签,增强了子图中数据的表达力和可读性。

通过这些例子,我们深入探讨了Matplotlib的画布分区技术及其在数据可视化中的应用。
在这里插入图片描述

进一步探索Matplotlib画布分区

自定义子图布局

Matplotlib允许用户自定义子图的布局方式,例如不规则的子图排列。以下是一个示例,展示了如何使用gridspec模块创建不规则布局的子图:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np# 生成一些虚构的数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = x**2
y4 = np.exp(x)# 创建画布并使用gridspec定义子图布局
fig = plt.figure(figsize=(12, 8))
gs = gridspec.GridSpec(3, 3, width_ratios=[1, 1, 2], height_ratios=[1, 2, 1])# 子图1
ax1 = plt.subplot(gs[0, 0])
ax1.plot(x, y1, color='blue', label='sin(x)')
ax1.set_title('Sine Curve')
ax1.legend()# 子图2
ax2 = plt.subplot(gs[0, 1])
ax2.plot(x, y2, color='green', label='cos(x)')
ax2.set_title('Cosine Curve')
ax2.legend()# 子图3
ax3 = plt.subplot(gs[1:, :2])
ax3.plot(x, y3, color='orange', label='x^2')
ax3.set_title('Quadratic Curve')
ax3.legend()# 子图4
ax4 = plt.subplot(gs[1:, 2])
ax4.plot(x, y4, color='red', label='exp(x)')
ax4.set_title('Exponential Curve')
ax4.legend()plt.tight_layout()
plt.show()

在这个例子中,我们使用gridspec模块创建了一个3x3的子图网格,通过width_ratiosheight_ratios参数指定了每行和每列的相对宽度和高度。然后,我们根据这个网格布局创建了四个子图,并在每个子图中绘制不同的数据。

3D子图

Matplotlib还支持在画布上创建3D子图。以下是一个简单的示例,展示如何创建一个包含3D散点图的子图:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np# 生成一些虚构的3D数据
x = np.random.rand(100)
y = np.random.rand(100)
z = np.random.rand(100)# 创建画布和3D子图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')# 绘制3D散点图
ax.scatter(x, y, z, c='blue', marker='o', label='Random Points')# 设置坐标轴标签
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')# 添加图例
ax.legend()plt.show()

在这个例子中,我们通过mpl_toolkits.mplot3d导入Axes3D,然后使用fig.add_subplot(111, projection='3d')创建了一个3D子图。接着,我们在3D子图中绘制了散点图,展示了X、Y、Z三个维度的数据关系。

结语

通过本文的介绍和实例,我们深入探讨了Matplotlib中画布分区的不同方法,并展示了如何在子图中绘制不同类型的数据。从自定义布局到3D子图,Matplotlib提供了丰富的功能,帮助用户创建复杂和多样化的图形。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423022.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

大模型的高效训练和部署技术卷出新高度

01 大模型训练的挑战 1. 大模型发展现状及问题 上图中展示了大模型的发展历程,其中纵坐标是 AI 模型的参数量。在过去几年间,AI 大模型的参数量飞速增长,大约每 18 个月时间就会增长 40 倍。例如 2016 年,世界最好的大模型 ResNe…

上位机图像处理和嵌入式模块部署(qt图像处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 很多人一想到图像处理,本能的第一反应就是opencv,这也没有错。但是呢,这里面还是有一个问题的,不知…

如何用 500 行 SQL 实现 GPT2学习

目录 理论背景实现过程GenerationTokenizerEmbeddingsAttention为什么我们需要有因果掩码?为什么矩阵是 Q,K 和 V? BlocksTokens为什么要使用 softmax 转换概率?Inference 俄罗斯有个大佬每年都会用 SQL 来实现一个挑战庆祝新年&a…

在linux部署Prometheus+Grafana+Exporter监控系统性能

Prometheus、Grafana和Report组件是什么? Prometheus、Grafana和Exporter是常用于系统监控和指标收集的组合。 Prometheus是一种开源的系统监控和警报工具。它可以收集各种指标数据,并提供强大的查询语言和灵活的警报规则,用于实时监控系统…

【论文阅读笔记】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

1.介绍 Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation Swin-Unet:用于医学图像分割的类Unet纯Transformer 2022年发表在 Computer Vision – ECCV 2022 Workshops Paper Code 2.摘要 在过去的几年里,卷积神经网络&#xff…

制造业实施了ERP,为啥还要实施MES?

为啥要实施MES系统? 很多客户听说ERP系统较多,做规划也是先实施ERP系统,觉得上了ERP系统,就可以取而代之MES系统了,其实不然,原因有几点。 1、车间信息高效沟通的刚需 工厂和车间需要信息畅通无阻&#x…

JS进阶-函数进阶(一)

• 函数提升 函数提升与变量提升比较类似,是指函数在声明之前即可被调用。 总结: 1. 函数提升能够使函数的声明调用更灵活 2. 函数表达式不存在提升的现象 3. 函数提升出现在相同作用域当中 • 函数参数 1. 动态参数 arguments 是函数内部内置的伪…

Apache DolphinScheduler社区新晋Committer:伏长海的开源之旅

文章作者:**伏长海** 文章整理:曾辉 个人介绍 大家好,我是伏长海,目前在珍岛集团担任大数据开发工程师职位! GitHub ID:fuchanghai 在算法平台后端的研究领域耕耘了三年,任务调度方面也有一年半的深入探索。闲暇时…

ORA-01033: ORACLE initialization or shutdown in progress---惜分飞

客户反馈数据库使用plsql dev登录报ORA-01033: ORACLE initialization or shutdown in progress的错误 出现该错误一般是由于数据库没有正常open成功,查看oracle 告警日志发现 Mon Jan 22 16:55:50 2024 Database mounted in Exclusive Mode Lost write protection disabled …

【Linux】—— 命名管道详解

命名管道是一种在操作系统中用于进程间通信的机制,它允许不同的进程之间通过管道进行数据交换。与匿名管道相比,命名管道具有更多的灵活性和功能。在本博客中,我们将深入探讨命名管道的概念、用途以及如何在编程中使用它们。 目录 &#xff…

pycharm创建vue项目idealTree:npm: sill idealTree buildDeps,换taobao源后还不好使?那就再换一个

心血来潮打算写个小项目,前后端分离,flask/fastapivue(具体用哪个后端还没想好),里面的功能大概就是目前所有热门的应用的合集,一键出结果的那种,然后跟随着科技趋势,不断去更新维护…