Python 基于另一个图形创建一个图形

Python 基于另一个图形创建一个图形,python,matplotlib,figure,Python,Matplotlib,Figure,我想在一个函数中生成一个图形,然后能够在另一个函数中向该绘图添加额外的内容。我希望这两个数字(原始和编辑的一个)可以供将来使用。比如: import numpy as np import matplotlib.pyplot as plt def plot_1(): X, Y = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 50)) z = np.random.rand(50, 100) fig, ax

我想在一个函数中生成一个图形,然后能够在另一个函数中向该绘图添加额外的内容。我希望这两个数字(原始和编辑的一个)可以供将来使用。比如:

import numpy as np
import matplotlib.pyplot as plt

def plot_1():
    X, Y = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 50))
    z = np.random.rand(50, 100)

    fig, ax = plt.subplots()
    ax.contourf(X, Y, z, cmap="viridis")

    return fig

def plot_2(fig):
    ax = fig.axes[0]
    ax.scatter([2, 5], [1, 4], zorder=2.5, color="r")

    return ax

f = plot_1()
f2 = plot_2(f)
但是,这会更改原始图像(我希望保持原样),并且不会在
f2
中返回可打印的图形。起初,我认为问题在于散点图没有绘制出来,而是按照Lucas在评论中的建议,这不是实际问题,因为它可以用
zorder
的正确值来解决


我怎样才能做到这一点呢?

如果我理解正确:你想要两个图形,在两个图形中绘制相同的图形,然后只在一个图形中绘制一些额外的图形

方法是在函数外部创建图形,并将轴传递给函数:

将numpy导入为np
将matplotlib.pyplot作为plt导入
def绘图_1(ax):
十、 Y=np.meshgrid(np.linspace(0,10100),np.linspace(0,10,50))
z=np.rand.rand(50100)
ax.tourtf(X,Y,z,cmap=“viridis”)
def绘图_2(ax):
最大散射([2,5],[1,4],zorder=2.5,color=“r”)
图1,ax_1=plt.子批次()
图2,ax_2=plt.子批次()
图1(ax图1)
图1(ax图2)
图2(ax图2)

这将使用轮廓图绘制两个图形,但只有一个图形使用散射图。

问题在于绘制顺序。默认情况下,散布在另一个绘图的下方。(例如,如果您使用不同的值创建两个散点,您将看到您的代码可以完美地工作)。试试:
ax.scatter([2,5],[1,4],zorder=2.5)
这能回答你的问题吗@Lucas,这似乎解决了部分问题,但脚本的行为仍不像我希望的那样。也就是说,我需要
f
f2
是不同的图形,可以在需要时单独使用/显示。在代码中,第一个图形似乎正在更改,而第二个图形甚至不是图形。有没有办法解决这个问题?我对问题进行了编辑,使我的问题更清楚。嗨,卢卡斯,谢谢你的回答。然而,这并不能解决我原来的问题。我需要绘制第一个图形一次,因为在我的真实案例中,这样做需要一些繁重的计算。这就是为什么我只想能够复制它并在另一个函数中编辑它,而不是从头开始重新创建它。我说清楚了吗?也许我无法恰当地表达我的问题……我认为复制(或深度复制)fig是不可能的。如果繁重的计算在绘图之前(而不是绘图本身),则可以缓存这些结果并在以后重用它们。如果情节是个问题,也许你可以这样做