在第一个仍然打开时用 matplotlib 绘制第二个图形
Posted
技术标签:
【中文标题】在第一个仍然打开时用 matplotlib 绘制第二个图形【英文标题】:Plotting second figure with matplotlib while first is still open 【发布时间】:2015-01-27 12:59:51 【问题描述】:K 这是我正在尝试做的更精确的示例。我使用 WXBuilder for Python 作为具有多种绘图功能的用户界面,即用户必须能够根据他们选择的参数绘制图形。绘制图表后,我希望用户能够在不关闭第一个图形的情况下绘制第二个图形。这是为了比较。下面是我想要做的一个过于简单的例子。
import matplotlib as plt
def OnPlotClick1(self, event):
plt.plot(self.DateArray1, self.kVAArray2)
plt.show()
def OnPlotClick2(self, event):
plt.plot(self.DateArray1, self.kVAArray2)
plt.show()
现在我假设我的问题是由于绘图和显示()图形而引起的,因此程序在某种程度上被阻止了功能,直到第一个图形或绘图窗口关闭。
我希望这能更好地解释我的问题。
【问题讨论】:
请显示您正在运行的代码的minimal, complete and verifiable example 以便我们重现问题,因为这显然是可能的。 【参考方案1】:您不应该阻止显示。使用:
import matplotlib.pylab as plt
plt.plot([1,2,3]) # first plot
plt.show(block=False) # do not block
plt.plot([11,21,31]) # second plot
【讨论】:
【参考方案2】:每个窗口都是 matplotlib 的说法,一个新的数字。您可以调用plt.subplots
两次来创建两个数字:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 1000)
y1 = np.sin(x)*np.exp(-x/5.0)
y2 = np.sin(x**2)*x
fig1, ax1 = plt.subplots()
ax1.plot(x, y1)
fig2, ax2 = plt.subplots()
ax2.plot(x, y2)
plt.show()
请注意,plt.show()
会启动一个 GUI 事件循环,因此通常每个脚本都是 should only be called once。
【讨论】:
是不是有点矫枉过正? OP 对plt.ion()
还不够吗?
@OliverW.:如果您知道如何使用 plt.ion()
执行此操作,请发布答案。
@OliverW:你说得对,多处理是多余的。两个数字就够了。
确实,希望你没有误会我的意思。您的解决方案很好。但我不确定 OP 所说的“不断崩溃”是什么意思,所以我想等一下。【参考方案3】:
你也可以在同一张图中画出2个或2个以上的绘图仪
import matplotlib.pyplot as plt
def my_plotter(ax, data1, data2, param_dict):
out = ax.plot(data1, data2, **param_dict)
return out
fig, (ax1, ax2) = plt.subplots(1, 2)
#here you put your data
data1=[0,1,2,3,8]
data2=[0,1,2,3,8]
data3=[0,1,2,3,8]
data4=[0,1,2,3,8]
my_plotter(ax1, data1, data2, 'marker':'x')
my_plotter(ax2, data3, data4, 'marker':'o')
plt.show()
【讨论】:
【参考方案4】:您可以遵循@(Corrupted MyStack) 的建议或使用交互式图形设备。运行
plt.ion()
一次,在你开始情节之前的任何时候。关闭它
plt.ioff()
【讨论】:
以上是关于在第一个仍然打开时用 matplotlib 绘制第二个图形的主要内容,如果未能解决你的问题,请参考以下文章
vfpoledb.1 在第二次打开时给出 IErrorInfo.GetDescription failed with E_FAIL(0x80004005)
UIImageView 在下一个 ViewController 打开时与 UILabel 重叠
带有复选框 selModel 的 ExtJs Gridpanel 窗口,在第二次打开时不显示复选框