我如何告诉Matplotlib创建第二个(新的)图,然后在旧的图上进行更新?


147

我想绘制数据,然后创建一个新图形并绘制数据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)

仅供参考,我如何告诉matplotlib我已经完成了一个情节?做类似的事情,但不完全相同!它并不允许我访问该原始图。

Answers:


152

如果您发现自己定期执行此类操作,则可能值得研究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

它稍微冗长一些,但是更容易跟踪,尤其是在几个具有多个子图的图形上。


2
我更喜欢面向对象的方法,因为当我预计会有很多数字时,使用名称而不是数字来跟踪它们会更容易。谢谢!
彼得D

1
但是,如何通过这种方法来更改标签和轴的限制。如果我使用ax1.ylabel它说找不到它。与fig1.ylabel... 相同
George Datseris 16'Aug

3
@GeorgeDatseris语法略有不同。这是ax1.set_xlabel("your x label")ax1.set_ylabel("your y label")ax1.set_title("your title")
simonb

1
为什么使用111?
亚什·索达

2
@yashSodha-这是子图数(行,列,索引)的matlab样式规范。但是现在使用起来要容易得多plt.subplots(nrows, ncols)。更新了示例。
simonb

120

致电时figure,只需为图编号即可。

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 Style”到文档)。


3
这似乎可以在matplotlib的交互模式下工作,而Figure()... add_subplot()方法则不行。谢谢!
chbrown 2014年

@SebMa请不要在不理解的情况下更改代码。该答案专门用于将数字传递给figure您删除的。您更改的其他内容是从原始帖子中复制的,而不是我的回答有误。
6

@agf嗨,我删除了1里面,plt.figure(1)因为我认为数字是自动递增的,因此没有必要。抱歉。
SebMa

18

但是,编号从开始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)命令where h是所需轴对象的句柄来集中于该轴。

(尚无评论权限,对不起,新答案!)


10
0可以,如果您根本不给它编号,那么自动编号就从开始1
2011年

0

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

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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.