【python】matplotlib 模块_画布Figure设置

文章介绍了Matplotlib中创建和管理画布与子图的各种方法,包括plt.figure()、plt.subplot()、plt.subplots()、add_subplot()、add_axes()以及subplots_adjust(),详细阐述了它们的功能和参数用法,帮助读者理解如何在Python中布局和调整图形元素。

目录

一. Part of a Figure

二. 画布设置

1. plt.subplot()

2. plt.subplots()

3. add_subplot()

4. plt.figure() 

5. add_axes()

 6. subplots_adjust()


一. Part of a Figure

官方指南:Matplotlib 文档 — Matplotlib 3.7.1 文档

  • Figure  fig = plt.figure(): 可以解释为画布。画图的第一件事,就是创建一个画布figure,然后在这个画布上加各种元素。
  • Axes  ax = fig.add_subplot(1,1,1): 可以理解为在画布上要画的一个图。如果figure只有一张图,那么只有一个axes;也可以用subplot() 函数设置多个axes。axes下可以修改编辑的变量非常多。
  • Axis ax.xaxis/ax.yaxis: 这是x、y坐标轴。每个坐标轴实际上是由竖线和数字组成的,每一个竖线是一个axis的subplot,因此ax.xaxis也存在axes这个对象。对这个axes进行编辑就会修改xaxis图像上的表现。

二. 画布设置

1. plt.subplot()

subplot(*args, **kwargs)

subplot(nrows, ncols, index, **kwargs)
subplot(pos, **kwargs)
subplot(ax)

  • *args:三个整数或一个三位数(自动解析成三个整数),用于分别对应 nrows, ncols, index

        - nrows:在画布纵轴上分隔成几个子图

        - ncols:在画布横轴上分隔成几个子图

        - index:子图索引

  • **kwargs:一些涉及子图属性的关键字参数。此方法还接受返回AXIS基类的关键字参数。

2. plt.subplots()

subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

  •  nrows,ncols:子图的行列数。
  • sharex, sharey:是否共轴。可选:‘none’, ‘all’, ‘row’, ‘col’, ‘True’, ‘False’。

        True 或者 ‘all’ 时,所有子图共享 x 轴或者 y 轴;

        False or ‘none’ 时,所有子图的 x,y 轴均为独立;

        ‘row’ 时,每一行的子图会共享 x 或者 y 轴;

         ‘col’ 时,每一列的子图会共享 x 或者 y 轴。

  • squeeze:默认为 True,是设置返回的子图对象的数组格式。当为 False 时,不论返回的子图是只有一个还是只有一行,都会用二维数组格式返回他的对象。当为 True 时,如果设置的子图是(nrows=ncols=1),即子图只有一个,则返回的子图对象是一个标量的形式,如果子图有(N×1)或者(1×N)个,则返回的子图对象是一个一维数组的格式,如果是(N×M)则是返回二位格式。
  • subplot_kw:字典格式,传递给 add_subplot() ,用于创建子图。
  • gridspec_kw:字典格式,传递给 GridSpec 的构造函数,用于创建子图所摆放的网格。如,设置 gridspec_kw={‘height_ratios’: [3, 1]} 则子图在列上的分布比例是3比1。
  • **fig_kw :所有其他关键字参数都传递给 figure()调用。如,设置 figsize=(21, 12) ,则设置了图像大小。
  • 返回值:fig: matplotlib.figure.Figure 对象;ax:子图对象( matplotlib.axes.Axes)或者是他的数组。

示例:

生成一块画布。1行2个,每一块是一个axe,返回画布和axes的数组,后面还可以跟一些figure的参数。

# 示例
fig, axes = plt.subplots(1, 2, figsize = (8, 10))

3. add_subplot()

面对对象的方法,参数及使用与subplot相似,但不会删除与其重叠的子图。

4. plt.figure() 

figure()创建一个新的画布,通过figure()函数来实例化Figure对象。

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num: 图像编号或名称,数字为编号 ,字符串为名称。
  • figsize: 指定figure的宽和高,单位为英寸。
  • dpi:参数指定绘图对象的分辨率。
  • facecolor:背景颜色。默认为:rc:figre.facecolor‘=’w‘
  • edgecolor:边框颜色。如果未提供,默认为:rc:figre.edgecolor‘=’w‘
  • frameon:是否显示边框(图形框架)
# 示例  分辨率参数-dpi,画布大小参数-figsize
fig = plt.figure(dpi=300, figsize=(24, 8))

5. add_axes()

面对对象的方法,创建一个子图,如范围内已有图像,则覆盖在原图像上。

 add_axes(rect, projection=None, polar=False, **kwargs)

  • rect:子图的位置,大小。以列表传入[左、下、宽、高];左 / 下:以百分比确定
  • projection:投影类型。
  • polar:为True时,相当于projection = ‘polar’
  • **kwargs:其他相关关键字参数
# 示例 创建两个子图对象,ax2将覆盖在ax1上
fig = plt.figure()
ax1 = fig.add_axes([0,0,1.5,1.5])
ax2 = fig.add_axes([0.5,0.5,1,1])

 6. subplots_adjust()

对子图的布局进行设置

 subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)

  • left:以图形宽度为单位,调整最左侧子图与画布左边框的距离,范围(0-1)
  • bottom:以图形高度为单位,调整最下侧子图与画布下边框的距离,范围(0-1)
  • right:以图形宽度为单位,调整最右侧子图与画布右边框的距离,范围(0-1)
  • top:以图形高度为单位,调整最上侧子图与画布上边框的距离,范围(0-1)
  • wspace:调整坐标系之间的水平间隔
  • hspace:调整坐标系之间的垂直间隔
  • left和right值的和为1,且left<=rigth;bottom和top值的和为1,且bottom<=top
fig, ax = plt.subplots(2, 2)
fig.subplots_adjust(left=0.1,  # 调整最左边坐标系到画布左边框的间距
                    right=0.9,  # 调整最右边坐标系到画布右边框的间距
                    top=0.9,  # 调整最上面坐标系到画布顶部框的间距
                    bottom=0.1,  # 调整最下面坐标系到画布底部框的间距
                    wspace=1,  # 调整坐标系之间的水平间隔
                    hspace=1,  # 调整坐标系之间的垂直间隔
                    )
plt.show()

<think>嗯,用户现在想了解如何在PythonMatplotlib设置画布和子图。我之前已经给出了一些关于Qt Charts、QCustomPlot和Matplotlib的示例,但现在需要根据用户提供的引用内容来调整回答。用户提供的引用中有几个具体的例子,比如使用add_subplot、subplots方法,以及设置画布大小和清空子图的操作。 首先,我需要整理用户提供的引用信息。引用1和引用3、4、5都是关于Matplotlib的子图设置,特别是add_subplot和subplots的使用。引用2提到了动态清空子图的方法,引用5则展示了subplots返回的axes数组的使用。用户的问题主要集中在设置画布和子图,所以需要涵盖这些方面。 接下来,我需要确定回答的结构。可能分为几个部分:创建画布、添加子图、高级设置、动态更新、样式统一等。每个部分结合引用中的代码示例,比如引用3中的fig1 = plt.figure(figsize=(9,7), dpi=90)展示了如何设置画布大小,引用5中的subplots(2,2)创建了多个子图。 还要注意用户之前的问题是关于添加子图,现在更具体到Matplotlib设置方法,可能需要详细说明不同的子图创建方法,比如add_subplot和subplots的区别,以及如何调整布局和样式。引用4提到在每个小的坐标系上绘图,这可能涉及到多个子图的排列方式。 此外,用户引用的内容中有动态清空子图的例子,这在回答中可能需要提到如何清空和更新子图,比如使用cla()方法。同时,引用中的示例展示了如何设置标题、坐标轴标签、刻度等,这些也是设置子图的重要部分。 需要确保回答覆盖了用户可能的需求,比如如何调整画布大小、创建不同布局的子图、设置子图属性以及动态更新。同时,结合用户提供的引用中的代码,给出具体的示例,让用户能够直接参考使用。 可能还需要注意一些细节,比如subplots返回的fig和axes对象的使用,如何通过索引访问不同的子图,以及如何设置全局的样式参数来保持一致性。引用5中的例子使用了a[0][0]来访问子图,这需要解释清楚。 最后,生成的相关问题需要与设置画布和子图相关,比如如何调整子图间距、共享坐标轴、保存多子图图像等,这些都能帮助用户进一步探索。</think>### Python Matplotlib 设置画布与子图的完整方法 在 Matplotlib 中,画布Figure)是绘图的顶层容器,子图(Axes)是画布中的独立坐标系区域。以下是核心方法及示例代码,结合您提供的引用内容进行说明: --- #### 一、**创建画布** 通过 `plt.figure()` 定义画布基础参数: ```python import matplotlib.pyplot as plt import numpy as np # 设置画布大小(宽9英寸,高7英寸),分辨率90dpi(引用3) fig = plt.figure(figsize=(9, 7), dpi=90) ``` --- #### 二、**添加子图** ##### 方法1:`add_subplot()` 按行列索引添加 ```python # 创建1行2列的布局,激活第一个子图(引用3) ax1 = fig.add_subplot(1, 2, 1) # 参数:(行数, 列数, 位置索引) ax1.plot(np.arange(5), np.arange(5)**2, label='y = x²') ax1.set_title("平方函数") # 设置子图标题 # 添加第二个子图(引用3) ax2 = fig.add_subplot(1, 2, 2) ax2.plot(np.arange(5), np.sin(np.arange(5)), label='sin(x)') ax2.set_title("正弦函数") ``` ##### 方法2:`plt.subplots()` 批量创建子图 ```python # 创建2行2列的子图网格(引用5) fig, axes = plt.subplots(2, 2, figsize=(10, 8)) axes[0, 0].plot(x, x**2, color='r') # 访问第一行第一列子图 axes[0, 0].set_title("平方") axes[1, 1].scatter(x, np.log(x)) # 访问第二行第二列子图 axes[1, 1].set_title("对数函数") ``` ##### 方法3:复杂布局(如嵌套子图) ```python # 使用GridSpec自定义布局(引用4扩展) import matplotlib.gridspec as gridspec fig = plt.figure() gs = gridspec.GridSpec(2, 2, width_ratios=[3, 1], height_ratios=[1, 3]) ax1 = fig.add_subplot(gs[0, :]) # 第一行占满所有列 ax2 = fig.add_subplot(gs[1, 0]) # 第二行第一列 ax3 = fig.add_subplot(gs[1, 1]) # 第二行第二列 ``` --- #### 三、**关键设置项** 1. **标题与标签** ```python ax.set_title("标题", fontsize=14) # 标题字号 ax.set_xlabel("X轴", fontsize=12) # X轴标签 ax.set_ylabel("Y轴", fontsize=12) # Y轴标签 ``` 2. **坐标轴范围与刻度** ```python ax.set_xlim(0, 10) # X轴范围(引用3) ax.set_ylim(-1, 1) # Y轴范围(引用3) ax.set_xticks([0, np.pi/2, np.pi]) # 自定义刻度(引用3) ax.tick_params(labelsize=10) # 刻度标签大小(引用3) ``` 3. **图例与样式** ```python ax.legend(['标签1', '标签2'], loc='upper right') # 图例位置 ax.grid(True, linestyle='--', alpha=0.6) # 网格线样式 ``` --- #### 四、**动态更新子图** 清空子图内容以更新数据(引用2): ```python ax.cla() # 清空当前子图所有内容 ax.plot(new_x, new_y) # 重新绘制 ``` --- #### 五、**统一样式与高级技巧** 1. **全局样式设置** ```python plt.style.use('seaborn') # 使用seaborn主题 plt.rcParams['font.family'] = 'SimHei' # 设置中文字体 ``` 2. **子图间距调整** ```python plt.subplots_adjust(wspace=0.3, hspace=0.5) # 调整水平/垂直间距 ``` 3. **共享坐标轴** ```python fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True) # 共享Y轴 ``` --- ### 示例整合(引用3 + 引用5) ```python import matplotlib.pyplot as plt import numpy as np # 创建画布与2个子图(引用5) fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # 第一个子图:多项式函数(引用3) axes[0].plot(np.linspace(0, 1, 100), np.linspace(0, 1, 100)**2, label='x²') axes[0].plot(np.linspace(0, 1, 100), np.linspace(0, 1, 100)**3, label='x³') axes[0].set_title("多项式比较") axes[0].legend() # 第二个子图:三角函数(引用3) x = np.linspace(0, 2*np.pi, 100) axes[1].plot(x, np.sin(x), linestyle='--', label='sin(x)') axes[1].plot(x, np.cos(x), linestyle=':', label='cos(x)') axes[1].set_title("三角函数对比") axes[1].set_xticks([0, np.pi/2, np.pi, 3*np.pi/2, 2*np.pi]) axes[1].set_xticklabels(['0', 'π/2', 'π', '3π/2', '2π']) # 自定义刻度标签 plt.tight_layout() # 自动调整子图间距 plt.show() ``` --- ### 相关问题 1. **如何保存包含多个子图的高清图像?**(需设置`dpi`和`bbox_inches`参数) 2. **如何为不同子图设置独立颜色映射(colormap)?** 3. **如何实现子图之间的交互联动(如缩放同步)?** 4. **如何用Matplotlib绘制三维子图?**(参考引用2中的`projection='3d'`) 5. **如何通过循环批量生成子图?**(结合`enumerate`和`subplots`方法)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值