解决python的matplotlib库,将多个图保存为多个文件造成重叠的问题

本文介绍了一个常见的Matplotlib绘图错误——在连续绘图时出现的图形重叠现象,并提供了一种简单的解决方案:使用plt.clf()在每次绘图前清除当前图像,确保每个图像独立显示。

 未修改前的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

plt.style.use('dark_background')
for i in range(2):
    if i ==0:
        labels = 'A', 'B', 'C'
        fracs = [20, 30, 50]
        plt.pie(x=fracs, labels=labels,  autopct='%3.1f %%',
                shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6 )

        plt.savefig("temp1.png")
        
        

    if i ==1:
        labels = 'Q', 'W', 'E'
        fracs = [30, 30, 40]
        plt.pie(x=fracs, labels=labels,  autopct='%3.1f %%',
                shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6 )
        plt.savefig("temp2.png")
        

 

然后打开两个文件查看结果 :

第一个图正常,接下来查看第二个图:

很明显,在画新一个图的时候,和上一个图混在一起了,所以代码作了以下修改:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

plt.style.use('dark_background')
for i in range(2):
    if i ==0:
        labels = 'A', 'B', 'C'
        fracs = [20, 30, 50]
        plt.pie(x=fracs, labels=labels,  autopct='%3.1f %%',
                shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6 )

        plt.savefig("temp1.png")
        plt.clf()#添加上这一行,画完第一个图后,重置一下
        

    if i ==1:
        labels = 'Q', 'W', 'E'
        fracs = [30, 30, 40]
        plt.pie(x=fracs, labels=labels,  autopct='%3.1f %%',
                shadow=True, labeldistance=1.1, startangle=90, pctdistance=0.6 )
        plt.savefig("temp2.png")
        

查看结果:

搞定。

<think> 我们使用Matplotlib绘制多有两种主要方式: 1. 使用`plt.subplot()`创建子 2. 使用`plt.subplots()`同时创建多个 下面我将详细说明这两种方法,并给出示例代码。 ### 方法一:使用`plt.subplot()` 这种方法逐个添加子,通过指定行数、列数以及当前子的位置索引来创建子。 语法: ```python plt.subplot(n_rows, n_cols, index) ``` 然后像绘制单个一样使用`plt.plot()`等函数,这些操作将作用于当前子。 示例:绘制2x2的子,共4个 ```python import matplotlib.pyplot as plt import numpy as np # 创建数据 x = np.linspace(0, 2*np.pi, 100) plt.figure(figsize=(10, 8)) # 设置整个像的大小 # 第一个子 plt.subplot(2, 2, 1) # 2行2列,第1个位置 plt.plot(x, np.sin(x)) plt.title('sin(x)') # 第二个子 plt.subplot(2, 2, 2) # 2行2列,第2个位置 plt.plot(x, np.cos(x)) plt.title('cos(x)') # 第三个子 plt.subplot(2, 2, 3) # 2行2列,第3个位置 plt.plot(x, np.tan(x)) plt.title('tan(x)') # 第四个子 plt.subplot(2, 2, 4) # 2行2列,第4个位置 plt.plot(x, np.exp(x)) plt.title('exp(x)') # 调整子之间的间距 plt.tight_layout() plt.show() ``` ### 方法二:使用`plt.subplots()`(推荐) 这种方法一次性创建所有子,并返回一个包含所有子对象的数组。使用这种方法可以更方便地操作每个子。 语法: ```python fig, axs = plt.subplots(n_rows, n_cols, figsize=(width, height)) ``` 其中`axs`是一个二维数组(当行数或列数大于1时),每个元素代表一个子对象。 示例:同样绘制2x2的子 ```python import matplotlib.pyplot as plt import numpy as np # 创建数据 x = np.linspace(0, 2*np.pi, 100) # 创建2x2的子,并设置整个像大小 fig, axs = plt.subplots(2, 2, figsize=(10, 8)) # 现在axs是一个2x2的数组,我们可以通过索引访问每个子 # 绘制第一个子(第0行,第0列) axs[0, 0].plot(x, np.sin(x)) axs[0, 0].set_title('sin(x)') # 第二个子(第0行,第1列) axs[0, 1].plot(x, np.cos(x)) axs[0, 1].set_title('cos(x)') # 第三个子(第1行,第0列) axs[1, 0].plot(x, np.tan(x)) axs[1, 0].set_title('tan(x)') # 第四个子(第1行,第1列) axs[1, 1].plot(x, np.exp(x)) axs[1, 1].set_title('exp(x)') # 调整布局 plt.tight_layout() plt.show() ``` ### 注意: 1. 当子只有一行或一列时,`axs`将是一维数组。 例如:`fig, axs = plt.subplots(1, 2)`,则`axs[0]`和`axs[1]`分别代表两个子。 2. 使用`set_title()`、`set_xlabel()`等方法设置子的标题和坐标轴标签。 3. `plt.tight_layout()`可以自动调整子参数,避免重叠。 ### 高级用法:合并子(跨多行多列) 使用`subplot2grid`或`GridSpec`可以实现更复杂的布局,例如一个子占据多行或多列。 示例(使用`subplot2grid`): ```python plt.figure(figsize=(10, 8)) # 创建一个3x3的网格,第一个子占据第一行两列 ax1 = plt.subplot2grid((3, 3), (0, 0), colspan=2, rowspan=1) ax1.plot(x, np.sin(x)) ax1.set_title('sin(x)') # 第二个子占据第一行第三列和第二行第三列(跨两行) ax2 = plt.subplot2grid((3, 3), (0, 2), rowspan=2) ax2.plot(x, np.cos(x)) ax2.set_title('cos(x)') # 第三个子占据第三行全部(跨三列) ax3 = plt.subplot2grid((3, 3), (2, 0), colspan=3) ax3.plot(x, np.tan(x)) ax3.set_title('tan(x)') plt.tight_layout() plt.show() ``` 使用`GridSpec`可以实现同样的效果,但更灵活,这里不展开。 以上就是在Matplotlib中绘制多的方法。根据需求选择合适的方式。 ### 相关问题 1. 如何设置所有子共享X轴或Y轴刻度? 2. 如何为整个形添加一个总标题? 3. 如何在子中添加例? 4. 如何保存包含多个的高分辨率像? 5. 如何绘制不同类型表(如柱状、散点)在同一张多个中? 希望这些方法能帮助你有效地组织多个表在同一张中展示[^1][^2]。 </think> 在 Python 中使用 Matplotlib多个像绘制在同一张中,主要有以下几种方法: ### 一、使用基本子布局 (subplot) 这是最常用的方法,通过指定网格布局创建多个: ```python import matplotlib.pyplot as plt import numpy as np # 创建 2×2 的子布局 plt.figure(figsize=(10, 8)) # 第一个子 plt.subplot(2, 2, 1) # (行数, 列数, 位置索引) x = np.linspace(0, 10, 100) plt.plot(x, np.sin(x)) plt.title('正弦函数') # 第二个子 plt.subplot(2, 2, 2) plt.plot(x, np.cos(x), 'r--') plt.title('余弦函数') # 第三个子 plt.subplot(2, 2, 3) plt.plot(x, np.tan(x), 'g-') plt.title('正切函数') # 第四个子 plt.subplot(2, 2, 4) plt.plot(x, np.exp(-x), 'm:') plt.title('指数衰减') plt.tight_layout() # 自动调整子间距 plt.show() ``` ### 二、面向对象方式 (subplots) 更推荐的方法,可直接获取 Axes 对象数组: ```python fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) # 访问子 axs[0, 0].plot(x, np.sin(x)) axs[0, 0].set_title('正弦函数') axs[0, 0].grid(True) axs[0, 1].plot(x, np.cos(x), 'r--') axs[0, 1].set_title('余弦函数') axs[1, 0].scatter(x, np.random.randn(100), c='g') axs[1, 0].set_title('随机散点') axs[1, 1].hist(np.random.randn(1000), bins=30, color='purple') axs[1, 1].set_title('正态分布直方') fig.suptitle('多示例', fontsize=16) # 添加总标题 plt.tight_layout() plt.show() ``` ### 三、复杂布局 (GridSpec) 对于不对称布局,使用 GridSpec: ```python from matplotlib.gridspec import GridSpec fig = plt.figure(figsize=(12, 8)) gs = GridSpec(3, 3, figure=fig) # 3行3列 # 左上角大 (占据第0行,前两列) ax1 = fig.add_subplot(gs[0, :2]) ax1.plot(x, np.sin(x) * np.exp(-x/2)) # 右上角小 (占据第0行,第2列) ax2 = fig.add_subplot(gs[0, 2]) ax2.pie([30, 40, 30]) # 底部长 (占据第1-2行,全部列) ax3 = fig.add_subplot(gs[1:, :]) ax3.imshow(np.random.rand(20, 20), cmap='viridis') plt.tight_layout() plt.show() ``` ### 四、叠加绘 (Overlay) 在同一坐标系叠加多个形: ```python plt.figure(figsize=(8, 6)) # 叠加三条曲线 x = np.linspace(0, 4*np.pi, 200) plt.plot(x, np.sin(x), label='sin(x)') plt.plot(x, np.cos(x), label='cos(x)') plt.plot(x, np.sin(x)+np.cos(x), 'k--', label='sin(x)+cos(x)') plt.title('三角函数叠加') plt.xlabel('x') plt.ylabel('y') plt.legend() # 显示例 plt.grid(alpha=0.3) plt.show() ``` ### 关键技巧 1. **布局调整**: - 使用 `plt.tight_layout()` 自动调整子间距 - 手动调整:`plt.subplots_adjust(wspace=0.3, hspace=0.4)` 2. **共享坐标轴**: ```python fig, axs = plt.subplots(2, 2, sharex=True, sharey=True) ``` 3. **添加统一元素**: ```python fig.text(0.5, 0.04, '公共X轴', ha='center') fig.text(0.04, 0.5, '公共Y轴', va='center', rotation='vertical') ``` 4. **保存高清**: ```python plt.savefig('multiplot.png', dpi=300, bbox_inches='tight') ``` > 掌握这些方法可以创建从简单比较到复杂仪表板的各种多布局[^1][^2]。 ### 相关问题 1. 如何在不同子间共享坐标轴刻度? 2. GridSpec 布局中如何实现单元格合并? 3. 如何为每个子添加独立例? 4. Matplotlib 中哪些参数控制子间距? 5. 如何创建带有共享颜色条的多个热力? 6. 在 Jupyter Notebook 中如何优化多的显示效果?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值