Python3 - 在多个图形上绘制相同的 matplotlib 轴对象?
Python3 - Plotting the same matplotlib axes object on multiple figures?
我有一个脚本,我正在对其进行调整以包含 GUI。在其中,我创建了一个带有子图的图(其排列取决于图的数量 - 例如 4 个图进入正方形而不是 4 个)。该图(每个分析的“目标”都有一个子图)被保存为 .png。
在构建 GUI 时,我正在编写 'results' 框架,并希望在各自的选项卡上显示这些单独的子图。我已经编写了代码来按照我想要的方式布置框架,但是为了将子图分成它们自己的图,我需要将完成的 Axes 对象(例如该目标的整个子图)绘制到一个新图形上框架。
由于在运行前不知道子图的数量,我已经在数组(/列表?)axs
中有我的 Axes objects/subplots,其成员是单独的 Axes 对象(每个包含使用 ax.scatter()
创建的数据点以及使用 ax.plot()
和 ax.annotate
创建的几行和注释。
当我最初创建轴时,我使用
fig, axs = plt.subplots(num='Title', nrows=numrow, ncols=numcol,
figsize=[numcol*5, numrow*5],
subplot_kw={'adjustable':'box', 'aspect':1})
现在有没有办法将这些轴绘制到一个新图形上(将包含在 GUI 的 'results' 框架中的图形)?在我的搜索中,我只想出了将多个轴绘制到单个图形上的方法(即如何使用 subplots()
),但没有想到如何将预先存在的 Axes 对象放入一个新图形中它最初没有关联。我不想从头开始重新绘制轴 - 已经有相当多的装饰和多个数据集/线绘制在它们上面。
有什么想法吗?很高兴 post 按要求编写代码,但由于这更多的是“我该怎么做”而不是“为什么我的代码不起作用”,所以我没有 post 太多。
谢谢!
我认为这是不可能的,您将不得不在另一个图中重新创建 Axes 对象。这只是代码重组的问题。请注意,您的方法不会显着提高渲染性能。无论如何,Matplotlib 都必须重新渲染 Axes 对象,这是计算量大的部分。创建对象相对便宜。
您要做的大致是这样的:
from matplotlib import pyplot
pyplot.ion()
figure1 = pyplot.figure()
axes = figure1.add_subplot()
axes.plot([0, 1], [0, 1])
figure2 = pyplot.figure()
figure2.add_axes(axes)
其中提出:
ValueError: The Axes must have been created in the present figure
以及 add_axes()
注释的文档:
In rare circumstances, add_axes
may be called with a single argument, an Axes instance already created in the present figure but not in the figure's list of Axes.
所以这非常清楚地表明这不是受支持的用例。
我有一个脚本,我正在对其进行调整以包含 GUI。在其中,我创建了一个带有子图的图(其排列取决于图的数量 - 例如 4 个图进入正方形而不是 4 个)。该图(每个分析的“目标”都有一个子图)被保存为 .png。
在构建 GUI 时,我正在编写 'results' 框架,并希望在各自的选项卡上显示这些单独的子图。我已经编写了代码来按照我想要的方式布置框架,但是为了将子图分成它们自己的图,我需要将完成的 Axes 对象(例如该目标的整个子图)绘制到一个新图形上框架。
由于在运行前不知道子图的数量,我已经在数组(/列表?)axs
中有我的 Axes objects/subplots,其成员是单独的 Axes 对象(每个包含使用 ax.scatter()
创建的数据点以及使用 ax.plot()
和 ax.annotate
创建的几行和注释。
当我最初创建轴时,我使用
fig, axs = plt.subplots(num='Title', nrows=numrow, ncols=numcol,
figsize=[numcol*5, numrow*5],
subplot_kw={'adjustable':'box', 'aspect':1})
现在有没有办法将这些轴绘制到一个新图形上(将包含在 GUI 的 'results' 框架中的图形)?在我的搜索中,我只想出了将多个轴绘制到单个图形上的方法(即如何使用 subplots()
),但没有想到如何将预先存在的 Axes 对象放入一个新图形中它最初没有关联。我不想从头开始重新绘制轴 - 已经有相当多的装饰和多个数据集/线绘制在它们上面。
有什么想法吗?很高兴 post 按要求编写代码,但由于这更多的是“我该怎么做”而不是“为什么我的代码不起作用”,所以我没有 post 太多。
谢谢!
我认为这是不可能的,您将不得不在另一个图中重新创建 Axes 对象。这只是代码重组的问题。请注意,您的方法不会显着提高渲染性能。无论如何,Matplotlib 都必须重新渲染 Axes 对象,这是计算量大的部分。创建对象相对便宜。
您要做的大致是这样的:
from matplotlib import pyplot
pyplot.ion()
figure1 = pyplot.figure()
axes = figure1.add_subplot()
axes.plot([0, 1], [0, 1])
figure2 = pyplot.figure()
figure2.add_axes(axes)
其中提出:
ValueError: The Axes must have been created in the present figure
以及 add_axes()
注释的文档:
In rare circumstances,
add_axes
may be called with a single argument, an Axes instance already created in the present figure but not in the figure's list of Axes.
所以这非常清楚地表明这不是受支持的用例。