Python 如何让Matplotlib创建第二个(新)绘图,然后再在旧绘图上绘图?
我想绘制数据,然后创建一个新的图形和绘图数据2,最后返回到原始绘图和绘图数据3,有点像这样: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
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
因为我认为数字是自动递增的,因此没有必要。对不起。