Python matplotlib:同时绘制到不同的绘图
由于第二个答案,我假设以下代码Python matplotlib:同时绘制到不同的绘图,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,由于第二个答案,我假设以下代码 import matplotlib.pyplot as plt for i1 in range(2): plt.figure(1) f, ax = plt.subplots() plt.plot((0,3), (2, 2), 'b') for i2 in range(2): plt.figure(2) f, ax = plt.subplots() plt.plot([1,2,3
import matplotlib.pyplot as plt
for i1 in range(2):
plt.figure(1)
f, ax = plt.subplots()
plt.plot((0,3), (2, 2), 'b')
for i2 in range(2):
plt.figure(2)
f, ax = plt.subplots()
plt.plot([1,2,3], [1,2,3], 'r')
plt.savefig('foo_{}_bar_{}.jpg'.format(i2, i1))
plt.close()
plt.figure(1)
plt.plot( [1,2,3],[1,2,3], 'r')
plt.savefig('bar_{}.jpg'.format(i1))
plt.close()
创建分别显示蓝线和红线的绘图bar_0.jpg
和bar_1.jpg
然而,数字看起来像
而不是
我怎样才能达到期望的行为?
请注意,在处理
条形图
时,必须关闭并保存绘图foo.*.jpg
。您已经在保存轴
对象,因此使用对象的绘图
功能,而不是调用PyPlot绘图
功能(该功能利用上次创建或激活的轴
):
ax.plot(...)
如果您随后为这两个名称指定了不同的名称,例如ax1
和ax2
,则可以在不影响其他名称的情况下绘制所需的名称。所有plt.
命令也作为Axes
成员函数存在,但有时名称会更改(plt.xticks
变为ax.set\xticks
)。有关详细信息,请参阅
要保存到地物,请以相同的方式使用地物
对象:
f.savefig(...)
仅供参考,这种API类型才刚刚出现在Matlab中,将来可能会取代老式的“绘制最后一个活动绘图”行为。这里的面向对象方法更灵活,开销最小,因此我强烈建议您在任何地方都使用它。您已经在保存
轴
对象,因此,不要调用PyPlotplot
函数(它利用上次创建或激活的轴
),使用对象“plot
功能:
ax.plot(...)
如果您随后为这两个名称指定了不同的名称,例如ax1
和ax2
,则可以在不影响其他名称的情况下绘制所需的名称。所有plt.
命令也作为Axes
成员函数存在,但有时名称会更改(plt.xticks
变为ax.set\xticks
)。有关详细信息,请参阅
要保存到地物,请以相同的方式使用地物
对象:
f.savefig(...)
仅供参考,这种API类型才刚刚出现在Matlab中,将来可能会取代老式的“绘制最后一个活动绘图”行为。这里的面向对象方法更灵活,开销最小,因此我强烈建议您在任何地方都使用它。如果不确定,最好明确:
import matplotlib.pyplot as plt
for i1 in range(2):
fig1,ax1 = plt.subplots()
fig2,ax2 = plt.subplots()
ax1.plot([0,4],[2,2],'b')
for i2 in range(2):
ax2.plot([1,2,3],[1,2,3],'r')
fig2.savefig('abc{}.png'.format(2*i1+i2))
plt.figure(1)
ax1.plot([1,2,3],[1,2,3],'r')
fig1.savefig('cba{}.png'.format(i1))
如果不确定,最好明确说明:
import matplotlib.pyplot as plt
for i1 in range(2):
fig1,ax1 = plt.subplots()
fig2,ax2 = plt.subplots()
ax1.plot([0,4],[2,2],'b')
for i2 in range(2):
ax2.plot([1,2,3],[1,2,3],'r')
fig2.savefig('abc{}.png'.format(2*i1+i2))
plt.figure(1)
ax1.plot([1,2,3],[1,2,3],'r')
fig1.savefig('cba{}.png'.format(i1))
我不太明白你为什么要把foo_1和foo_2写两次到文件中,还有,你能清楚地说明你想要的行为吗?这只是一个简单的例子,我想在foo_1.jpg和foo_2.jpg中绘制一些东西。所需的行为如下:执行几次:(1)创建一个绘图并为其绘制一些内容,(2)创建一个新绘图,在其中绘制一些内容,然后保存并关闭它(3)返回到上一个绘图,并在其中绘制其他内容,然后保存它。我不太明白为什么要将foo_1和foo_2写入文件两次,你能清楚地说明你想要的行为吗?这只是一个最小的例子,我想在foo_1.jpg和foo_2.jpg中绘制一些东西。所需的行为如下:执行几次:(1)创建一个绘图并为其绘制一些内容,(2)创建一个新绘图,在其中绘制一些内容,然后保存并关闭它(3)返回到上一个绘图,并在其中绘制其他内容,然后保存它。我们为什么要谈论matlab?非常有用,谢谢!但是我的问题中提到的答案是错误的,不是吗?@tom除了我,没有人在谈论Matlab。还有你,现在。我之所以提出这个问题,是因为Pyplot API是按照MatlabAPI建模的,“面向对象API”不是。@corinna这没有错,这是解决问题的另一种方式。调用
plt.figure(1)
将当前图形设置为创建的第一个图形,就像在Matlab中一样,调用figure(1)
将激活第一个图形。这种方式引入隐藏状态(即哪个图形是当前的?),当直接使用对象时,从代码中可以清楚地看到正在做的事情。对,但是面向对象的方法在matplotlib中已经存在很长时间了,将其添加到与matlab无关的答案中感觉很奇怪。但是,你知道,每个人都是他/她自己的为什么我们要谈论matlab?很好,非常感谢!但是我的问题中提到的答案是错误的,不是吗?@tom除了我,没有人在谈论Matlab。还有你,现在。我之所以提出这个问题,是因为Pyplot API是按照MatlabAPI建模的,“面向对象API”不是。@corinna这没有错,这是解决问题的另一种方式。调用plt.figure(1)
将当前图形设置为创建的第一个图形,就像在Matlab中一样,调用figure(1)
将激活第一个图形。这种方式引入隐藏状态(即哪个图形是当前的?),当直接使用对象时,从代码中可以清楚地看到正在做的事情。对,但是面向对象的方法在matplotlib中已经存在很长时间了,将其添加到与matlab无关的答案中感觉很奇怪。但是,你知道,每个人都有自己的权利