Python 如何让Matplotlib创建第二个(新)绘图,然后再在旧绘图上绘图?

Python 如何让Matplotlib创建第二个(新)绘图,然后再在旧绘图上绘图?,python,matplotlib,plot,figure,Python,Matplotlib,Plot,Figure,我想绘制数据,然后创建一个新的图形和绘图数据2,最后返回到原始绘图和绘图数据3,有点像这样: import numpy as np import matplotlib as plt x = arange(5) y = np.exp(5) plt.figure() plt.plot(x, y) z = np.sin(x) plt.figure() plt.plot(x, z) w = np.cos(x) plt.figure("""first figure""") # Here's the

我想绘制数据,然后创建一个新的图形和绘图数据2,最后返回到原始绘图和绘图数据3,有点像这样:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI也做了类似的事情,但不完全一样!它不允许我访问原始绘图。

当您调用
时,只需给绘图编号即可

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

编辑:请注意,您可以根据需要对绘图进行编号(此处,从
0
开始),但如果您在创建新绘图时根本没有为图形提供编号,则自动编号将从
1
开始(“Matlab样式”根据文档)。

但是,编号从
1
开始,因此:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)
此外,如果图形上有多个轴,例如子地块,请使用
axes(h)
命令,其中
h
是所需轴对象的控制柄,以聚焦于该轴


(还没有评论权限,很抱歉有新的答案!)

如果您发现自己经常做类似的事情,那么研究matplotlib的面向对象接口可能是值得的。就你而言:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

它有点冗长,但更清晰、更容易跟踪,特别是对于多个图形,每个图形都有多个子图。

经过一番努力后,我发现有一种方法是创建一个函数,该函数将数据、绘图矩阵、文件名和顺序作为参数,以从有序图形中的给定数据创建箱线图(不同的顺序=不同的数字)并将其保存在给定的文件名下

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()

这里公认的答案是使用面向对象的接口(即
matplotlib
),这是一种方法。但是,答案的代码包含了(部分)MATLAB风格的接口(即
matplotib.pyplot

但是,可以选择仅使用OOP方法,该方法可以直接解决当前问题,并允许我们一次处理多个图形:

import numpy as np
import matplotlib

x = np.arange(5)
y = np.exp(x)
first_figure      = matplotlib.figure.Figure()
first_figure_axis = first_figure.add_subplot()
first_figure_axis.plot(x, y)

z = np.sin(x)
second_figure      = matplotlib.figure.Figure()
second_figure_axis = second_figure.add_subplot()
second_figure_axis.plot(x, z)

w = np.cos(x)
first_figure_axis.plot(x, w)

display(first_figure) # Jupyter
display(second_figure)

这使得用户可以手动控制图形,并避免与仅支持单个图形的
pyplot
内部状态相关的问题,例如当您希望从库函数返回图形时。

为每个迭代绘制单独的帧的简单方法可以是:

import matplotlib.pyplot as plt  
for grp in list_groups:
        plt.figure()
        plt.plot(grp)
        plt.show()

然后python将绘制不同的帧。

0
可以工作,自动编号只从
1
开始,如果你根本不给它一个数字的话。我更喜欢面向对象的方法,因为当我预期有许多数字时,使用名称而不是数字来跟踪它们会更容易。谢谢!但是如何更改标签呢l和轴限制。如果我使用
ax1.ylabel
它表示找不到它。与
fig1.ylabel
相同,@GeorgeDatseris语法有点不同。它是
ax1.set\u xlabel(“你的x标签”)
ax1.set\u ylabel(“你的y标签”)
,和
ax1.set\u title(“你的标题”)
。为什么要使用111?@yashSodha-这是一个matlab风格的子批次(行、列、索引)数量规范。但是现在使用plt更容易了。子批次(nrows、ncol)。已经更新了示例。这似乎在matplotlib的交互模式下工作,而figure()…add_subplot()方法没有。谢谢!@SebMa请不要在不理解的情况下更改代码。这个答案特别是关于将一个数字传递给
,您将其删除。您更改的其他内容是从原始帖子中复制的,我的答案中没有错误。@agf嗨,我删除了
plt.图(1)中的
1
因为我认为数字是自动递增的,因此没有必要。对不起。