Spyder: 调试时看不到用Matplotlib绘制的图

创建于 2015-02-17  ·  47评论  ·  资料来源: spyder-ide/spyder

_From al.dan ... @ gmail.com on 2011-04-12T17:33:50Z_

该脚本在spyder中运行时可以正常工作并生成等高线图:

#!/ usr / bin / env python
从matplotlib.pyplot导入imshow,显示
将numpy导入为np
x = np.random.rand(4,5)
imshow(x)
节目()

但是,如果我进入调试模式并将断点放在imshow(x)行,然后在(Pdb)提示符下手动键入imshow(x)和show()命令,则不会显示任何图。 我只得到对plot对象的引用:

(Pdb)imshow(x)

(Pdb)show()
(Pdb)

能够在调试模式下绘制变量将是一个很好的增强。

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1(WXAgg后端)
RHEL 4.8 x86_64

_原始问题: http

11–20 stars Debugger Bug

最有用的评论

有关详细信息,请参见https://github.com/matplotlib/matplotlib/pull/4779

非常简短的版本,为了使GUI响应,它需要运行事件循环(本质上是等待用户I / O的无限循环)。 调试提示也在无限循环中等待用户键入。 在“正常”提示符下,完成了一些细腻的集成工作,以使这两个循环共享(基本上,该提示符使GUI循环运行,直到按下单个键,处理这些键,然后重新启动GUI事件循环)。 在调试提示下,此集成未完成,并且该图似乎“已死”。 这将影响任何基于GUI的窗口。

调用plt.pause()起作用的原因是在给定的秒数内显式运行GUI事件循环。

内联后端有效,因为它仅产生静态png(_always_'dead'也是如此)。

所有47条评论

_From al.dan ... @ gmail.com on 2011-04-12T15:40:57Z_

忘了补充说,这是与spyder 2.0.8和ipython 0.10.1一起使用的。
另外,运行spyder时的后端是Qt4Agg。 我直接从终端窗口(即独立于spyder)运行ipython时得到WXAgg。

_从ccordoba12于2011-05-15T19:31:44Z_

标签: Cat调试器

_from ccordoba12 on 2011-08-16T11:41:02Z_

第733号问题已合并到此问题中。

_从eigenjoh ... @ gmail.com于2011-11-10T07:23:21Z_

此修复程序将使该应用程序成为matlab杀手

_从kavaldj ... @ gmail.com于2013-05-12T21:43:03Z_

这个问题已经解决或解决了吗?

我同意评论#4 :这将使Spyder更接近ML杀手

_来自2013年5月13日

1:这很正常,matplotlib的默认后端是WXAgg。 您可以在脚本中更改它:

导入matplotlib
matplotlib.use('Qt4Agg',warn = False)

_在2013-05-13T07:45:45Z_上来自jed.lud ... @ gmail.com

经过更多测试之后,最近进行的其他诊断:

  • 在当前交互式Python会话或交互式IPython会话中执行脚本时,在Spyder内进行调试时,绘图失败。 对于Qt4Agg或WXAgg后端,这是正确的。
  • 如果脚本设置为在其专用的Python解释器中执行,则在Spyder内进行调试时进行绘图即可正常工作。 这也独立于后端。
  • 在系统控制台中执行“ ipython qtconsole”会话时,调试期间的绘图工作正常。

Soyder 2.3.0dev(修订版0bb65fdb4b6e)
Python 2.7.3 32位
IPython 0.13.2
Matplotlib 1.2.0
Windows 7(64位)

_从kavaldj ... @ gmail.com于2013-05-14T13:45:31Z_

8杰德,谢谢!

在专用的解释器中运行调试对我有用,谢谢您的出色提示!

如果我看起来很贪心,我深表歉意,但是有没有一种简单的方法可以使图形非模态化呢?

现在,它在Pdb中停止时会阻止解释器,也许还有另一个我可以使用的技巧? 我只是在调用imshow(data),show()。

提前非常感谢您!

_从jed.lud ... @ gmail.com于2013-05-14T16:55:16Z_

@ -kavaldijiev:使图形成为非模态是很难解决的。 看起来Carlos在问题#733下寻求解决此问题,如果没有一些有趣的线程工作,这可能并不容易。 它可能与matplotlib的交互模式(必须与pdb并行运行)有关,并且您必须弄清楚如何使这些线程进行协作。

请注意,如果您尝试在IPython Qt Console中进行调试时进行绘图,则在发出“ show()”命令后,它也会阻塞。 那里也不是完全互动的。

在专用的解释器中运行似乎是目前最好的解决方法。

_从kavaldj ... @ gmail.com于2013-05-15T14:54:57Z_

@ -jed谢谢详细的解释!

我将使用模态数字进行管理。 但是从长远来看,绝对值得使它工作,这对于MATLAB人群可能非常有吸引力。

_从jed.lud ... @ gmail.com于2013-05-16T07:57:29Z_

@ -kavaldijiev:经过更多调查后,还有另一种解决方法应为您提供一种在调试时进行交互式绘图的方法。 似乎是Qt GUI组件妨碍了交互式绘图。 如果您运行IPython _without_ Qt控制台界面,则在调试_without_阻塞时交互式绘图将起作用。 以下是命令:

  1. 打开命令提示符,并cd到脚本所在的目录。
  2. 在提示符下运行“ ipython --pylab”。
  3. 在IPython内部,运行“%run -d.py”
  4. 现在,您应该能够使用pdb命令逐步执行代码,使用imshow()进行绘制,并且绘制图形时应不会阻塞命令行输入。

_从jed.lud ... @ gmail.com于2013-05-16T15:11:32Z_

而且,经过更多研究,我找到了这个答案: http :

从matplotlib.pyplot导入imshow,暂停
将numpy导入为np
x = np.random.rand(4,5)
imshow(x)
暂停(1)

您可以在调试期间在Spyder交互式控制台内以交互方式更新该图,而不会发生阻塞! 因此,请使用pause(1)而不是show()。 绘图仅在暂停持续时间内是交互式的,因此,如果您需要更多时间来缩放或平移数据,请使用pause(10)或pause(20)。 也可以在IPython Qt Console中使用。

_从kavaldj ... @ gmail.com于2013-05-16T22:35:04Z_

@ -jed,谢谢,两种方法都可以!

命令提示符方法显得更健壮-我可以关闭打开的图形,并且图形可以得到焦点(用于缩放等),直到关闭为止。

暂停方法显然更可取,因为它在Spyder中。 暂停将返回键盘控件,但不应关闭窗口,否则解释器将挂起。打开更多新图形是不稳定的-有时会成功,有时则不会,但是我没有花太多时间进行测试。

在任何情况下,它们中的任何一个对于调试都非常有用,甚至不如ML那样简单而强大。

干杯,

_从al.dan ... @ gmail.com于2013-05-19T21:08:30Z_

几年后很高兴看到进展。 是的,pause(n)技巧对我来说效果很好。 感谢@ -jed提供解决方案!

_From jed.lud ... @ gmail.com on 2013-05-20T09:13:28Z_

除了调查之外,我对其他事情一无所获。 pause(n)函数是我刚发现的matplotlib功能。

最终,这个问题的根源实际上是matplotlib绘图事件循环和Qt应用程序事件循环之间的相互作用,我不确定是否真的有“ Spyder”解决方案。 它可能必须在matplotlib级别解决。 由此可见,在Qt控制台中运行的IPython也遭受这些相同的限制。

_从jason.bo ... @ gmail.com于2014-07-07T05:33:04Z_

这个问题似乎在IEP中已解决: https

_从ccordoba12于2014-07-07T07:53:08Z_

第1848期问题已合并到此问题中。

我只是想知道是否有人可以给我一些关于我们将如何处理所有问题的观点。 我怀疑我不是唯一一个花费大量时间使用Matlab并因各种原因而被Python世界吸引的人,并且感觉到真正的生产力惊人地接近,但是像海市rage楼似乎总是刚刚出现。触手可及。 pause()解决方法非常出色,Spyder团队的响应能力确实令人印象深刻。 既然El Capitan的慢速编辑器问题似乎在3.0 beta中被淘汰了,那一切似乎太接近了。 但是 ...

那么专家认为这一切将走向何方? 据我所知,问题的很大一部分是Matplotlib本身。 我还认为guiqwt也不是很好的形状。 那么人们是否认为我们正朝着可以在IDE中进行调试,命中断点并从断点进行交互式绘图的方向无缝地进行的情况? 我认为这是所有Matlab前用户想要的,我们中的一些人想知道我们是否应该花200美元购买Matlab Home Edition,回到The Borg并摆脱Python方法以及基于社区的软件和软件的吸引力。 Python语言。

听起来好像是我在抱怨,但实际上我只是想弄清楚如何花时间。 我真的希望Python成为Matlab的杀手it ...

@jandyman ,请不要失望:-)我们一直在对Spyder 3.0进行大规模的重组/清理,这将对Spyder 4.0十分有益,我们计划在此解决该问题。

真正的问题不在于Matplotlib,而是在于IPython / Jupyter架构,该架构在调试时阻止了控制台,阻止了我们像Matlab一样运行功能更强大的调试会话(包括历史浏览和绘图)。

但是让我向您保证,在3.0发行(一个月左右)后,我们将尽一切努力来解决Spyder遇到的许多突出且非常令人讨厌的调试问题。 如果一切顺利,我们成功了,我们计划在今年年底或下一个年初发布版本4.0(如我所说)的修补程序:-)

我还发现guiqwt也不是很好的形状

那是一个@PierreRaybaut项目(创建Spyder的那个人)。 不幸的是,他最近没有太多时间来开源:-(

我还发现guiqwt也不是很好的形状

那是一个@PierreRaybaut项目(创建Spyder的那个人)。 不幸的是,他最近没有太多时间来开源:-(

@ ccordoba12,@jandyman:这是正确的,很遗憾。
但是,我最近在guiqwt上做了一些重要的工作:我已经通过在纯Python中重新实现PyQwt过时的问题(请参阅PythonQwt project )解决了问题,因此guiqwt v3不再依赖PyQwt了。 我不认为guiqwt现在状况不佳:由于最近的发展,它可以在Python 2.7、3.0-3.5和Qt4-Qt5上运行。 但是该项目没有增长,因为我没有时间来管理它(即,创建新功能,升级库等)-我只是在进行维护,因此当前功能仍可以像以前一样工作。 实际上,请注意,它比matplotlib(或MATLAB)的性能要高得多,例如可以实时显示和处理大图像(缩放/平移,调整对比度,绘制横截面等),这是一个关于交互性,matplotlib遥遥领先。

关于@jandyman的原始帖子,我无法认为没有解决方案可以使用Python / Spyder替代MATLAB。 就个人而言,在2009年,我已经能够做到并且毫不妥协。 但是,在2009年实现此目标的解决方案不再适用于当前代码状态:当时,Spyder依赖于“纯” Python解释器。 正如@ ccordoba12所述,Spyder现在依赖IPython / Jupyter:这是一件了不起的事情,因为它启用了许多新功能,但也有其缺点。
无论如何,我不明白为什么在Spyder中无法以与在MATLAB中相同的方式进行交互。

嗨,大家好,

我是从MATLAB转到Python的用户之一。 我认为Spyder是一个很棒的IDE,但是调试时没有交互式绘图的问题对于来自MATLAB的人员来说是一个重要的缺点。

我认为解决它应该不那么困难。 例如,我从系统终端(没有qtConsole)运行IPython,并且可以从IPython或ipdb会话中完美地进行交互式绘图(guiqwt)。 另外,调试时我有命令历史记录。 我认为,如果您只是替换(或添加选项)从终端(没有qtConsole)运行ipython,则将解决此问题。

请尝试解决此问题,因为我认为这是阻止许多人使用Spyder的唯一方法。

谢谢,

费利佩

我认为解决它应该不那么困难。

它是。 IPython在终端中使用的库和技术与qtconsole完全不同。

这个bug已经开放了5年了,并且还有一段时间了;-)

我需要此功能,因为我使用Spyder作为开发图像处理算法的主要IDE,在调试时查看图像是非常常见的功能要求。

我也想要,我主要使用Spyder进行调试。

@mmagnuski ,现在可以通过在调试时使用%plot魔术来实现,就像这样

%plot plt.plot(range(10))

但是,要执行此操作,您需要将Matplotlib后端设置为Inline

@tacaswell我正在与@WeatherGod交谈,他认为您可能会喜欢上。

如果可以“无缝”运行,那将很酷,尽管我知道这很困难。

现在,我使用pause(10)技巧。

有关详细信息,请参见https://github.com/matplotlib/matplotlib/pull/4779

非常简短的版本,为了使GUI响应,它需要运行事件循环(本质上是等待用户I / O的无限循环)。 调试提示也在无限循环中等待用户键入。 在“正常”提示符下,完成了一些细腻的集成工作,以使这两个循环共享(基本上,该提示符使GUI循环运行,直到按下单个键,处理这些键,然后重新启动GUI事件循环)。 在调试提示下,此集成未完成,并且该图似乎“已死”。 这将影响任何基于GUI的窗口。

调用plt.pause()起作用的原因是在给定的秒数内显式运行GUI事件循环。

内联后端有效,因为它仅产生静态png(_always_'dead'也是如此)。

感谢您的解释和相关问题,托马斯!

我认为这个PR可以解决它: https :

做得好! 非常感谢@ impact27!

有什么解决办法吗? 在plt.pause(1)之后,我无法关闭数字。 我尝试了plt.close()并再次暂停,但是成功了。 谢谢

有什么解决办法吗? 在plt.pause(1)之后,我无法关闭数字。 我尝试了plt.close()并再次暂停,但是成功了。 谢谢

您必须将图形编号作为参数提供给plt.close() (或'all' )。 现在的解决方案是plt.pause 。 如果ipykernel合并https://github.com/ipython/ipykernel/pull/438 ,则将解决该问题

有什么解决办法吗? 在plt.pause(1)之后,我无法关闭数字。 我尝试了plt.close()并再次暂停,但是成功了。 谢谢

您必须将图形编号作为参数提供给plt.close() (或'all' )。 现在的解决方案是plt.pause 。 如果/如果ipykernel合并ipython / ipykernel#438 ,则将解决该问题。 我个人使用了与该分支合并的ipykernel的修改版本。

没用我运行plt.figure(1); plt.imshow(myimage); plt.pause(1); plt.close(1),没有结果。 我正在使用IPython 7.11.1,Spyder 4.0.1和python 3.7.5

我能够繁殖。 请打开一个新的问题。 一种解决方法是,您可以在plt.pause以下的情况下用叉将其关闭

我能够繁殖。 请打开一个新的问题。 一种解决方法是,您可以在plt.pause以下的情况下用叉将其关闭

此解决方法有效。 那真是怪了。 不管怎么说,还是要谢谢你

这不仅是调试时的问题。 我已激活嵌入式后端。 这是一个最小的工作示例:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

如果我在示例中“运行文件”,则会显示一个内联图。 如果选择整个示例并选择“运行选择或当前行”,则会出现一个内联图。 如果我选择1-6行和“运行选择或当前行”,然后在控制台中键入示例的其余部分,则不会显示任何图。 确实出现了对绘图对象的引用。

这不仅是调试时的问题。 我已激活嵌入式后端。 这是一个最小的工作示例:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

如果我在示例中“运行文件”,则会显示一个内联图。 如果选择整个示例并选择“运行选择或当前行”,则会出现一个内联图。 如果我选择1-6行和“运行选择或当前行”,然后在控制台中键入示例的其余部分,则不会显示任何图。 确实出现了对绘图对象的引用。

我认为这与该错误无关。 这是使用内联后端的局限性,即情节本身不会“重绘”。 如果需要在嵌入式后端中显式绘制某些内容,则可以执行以下操作:

from IPython.core.display import display
display(fig)

display(fig)有效。 尽管如此,完全运行文件和部分运行文件以及在控制台中完成之间的不一致行为仍然令人困惑。

@kdpenner-如果您在单元格之间分割代码,则会在笔记本中得到相同的行为,这是预期的。 但是我认为您不需要为此使用display()函数。 在控制台中键入fig应该可以画出数字。

fig也可以。 也许这种行为上的差异是设计出来的,但是这并不是我作为用户所期望的。

@kdpenner我的意思是,在带有内联后端的其他环境中,您将得到相同的行为,因此Spyder不会出现此问题。

@mmagnuski理解了。 感谢fig解决方法。

🎉

非常感谢您解决此问题!

令人兴奋!

您可以在此处阅读有关此信息以及对我们的调试器的其他改进,这些改进是在4.2.0版中发布的。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jdweaver picture jdweaver  ·  77评论

CAM-Gerlach picture CAM-Gerlach  ·  75评论

Diti24 picture Diti24  ·  47评论

andreperesnl picture andreperesnl  ·  128评论

sayboltm picture sayboltm  ·  46评论