在第一个仍然打开时用 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 重叠

Show Segue from 按钮打开时没有导航控制器

带有复选框 selModel 的 ExtJs Gridpanel 窗口,在第二次打开时不显示复选框

当子进程仍然打开时,为啥 Java 进程会从 Gradle 挂起?

boost::asio::acceptor - 在旧连接仍然打开时接受新的传入连接