show()不再重绘

时间:2010-05-07 14:12:12

标签: python matplotlib

我在linux上工作,我不知道为什么使用python和matplotlib命令只会绘制一次我想要的图表。 我第一次调用show()时会绘制情节,没有任何问题,但不是第二次及以下情况。

我关闭窗口,显示两个调用之间的图表。你知道为什么和热修复它吗?

谢谢AFG

from numpy import *
from pylab import *

data = array( [ 1,2,3,4,5] )
plot(data)
[<matplotlib.lines.Line2D object at 0x90c98ac>]
show() # this call shows me a plot

#..now I close the window...

data = array( [ 1,2,3,4,5,6] )
plot(data)
[<matplotlib.lines.Line2D object at 0x92dafec>]
show()  # this one doesn't shows me anything

4 个答案:

答案 0 :(得分:1)

在Windows中

这完美无缺:

from pylab import *
plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x03442C10>]
#close window here
plot([1,2,3,4])
[<matplotlib.lines.Line2D object at 0x035BC570>]

你试过:

from matplotlib import interactive
interactive(True)

有时matplotlib会产生一些令人头疼的问题,因为我们必须记住在matplotlibrc中设置了一些选项(例如后端或交互式参数)。如果您使用来自不同编辑器的matplotlib(IDLE-tk,pycrust-wxpython)或交互式交互式脚本,那么您必须考虑在一种模式下工作的配置可能会在其他模式下给您带来问题,并且必须以编程方式进行修改或使用专用配置文件。

我给出的示例,直接工作(并且没有show())因为在matplotlibrc中我将交互式设置为True作为默认值

答案 1 :(得分:1)

您的编辑器/ IDE窗口系统和绘图窗口之间可能存在冲突。

一个非常好的方法是使用IPython。 IPython是一个很棒的互动环境,已经解决了这些问题,还有许多其他优点。首先,使用命令(从终端窗口)ipython -pylab启动IPython,使其处于交互式pylab模式。

答案 2 :(得分:0)

我猜你在Windows上的IDLE中这样做,因为那是我注意到同样问题的地方。

从我推断的结果来看,当使用matplotlib和IDLE时,使用TkAgg后端存在一个问题,该后端带有基本的Python dist,并且似乎是matplotlib的默认值。它与IDLE使用子进程的方式有关,因为如果我使用-n选项启动IDLE,这会禁用子进程,我没有这个问题。在Windows上使用-n选项启动IDLE的简单方法是右键单击并存档并选择“Open with IDLE”。如果你这样做,你应该得到一个IDLE shell     ===没有子进程===

就在提示之上。例如,从joaquin的解决方案中借用代码,您可以尝试这个简单的代码:

from matplotlib import interactive
interactive(True)
from pylab import *
plot([1,2,3,4])

然后关闭窗口并再次在控制台中输入最后一行。它在IDLE中使用-n选项。

那你能做什么?您总是可以在没有子进程的模式下运行IDLE,但是存在危险。您可以使用其他IDE。很多人建议使用IPython,虽然我自己还没有卖掉它。你也可以为matplotlib尝试不同的后端。我会在一段时间内尝试一下,因为我一直在想它是否会起作用。

答案 3 :(得分:0)

show()仅用于在程序中使用一次,最后:它是一个永不停止的循环,用于检查图形窗口中的事件。

正常的做法是:

# … plot …
draw()  # Draws for real
raw_input()  # Or anything that waits for user input

# … 2nd plot …
draw()
raw_input()

# Last plot
show()  # or, again, draw(); raw_input()

您可以尝试查看这是否适合您。

或者,您可以尝试更改后端,因为有些后端比其他后端工作得更好:

import matplotlib
matplotlib.use('TkAgg')  # For other backends, do matplotlib.use('') in a shell