如何在 Spyder/IPython/matplotlib 中再次获得交互式绘图?
Posted
技术标签:
【中文标题】如何在 Spyder/IPython/matplotlib 中再次获得交互式绘图?【英文标题】:How do I get interactive plots again in Spyder/IPython/matplotlib? 【发布时间】:2014-06-28 09:42:30 【问题描述】:我在 Windows 7 中从 Python(x,y) 2.7.2.3 升级到 2.7.6.0(很高兴看到我终于可以键入 function_name?
并再次在 Object Inspector 中看到文档字符串)但现在绘图不像以前那样工作了。
以前(Spyder 2.1.9、IPython 0.10.2、matplotlib 1.2.1),例如,当我绘制 this script 时,它会在交互式窗口中并排绘制子图:
现在(Spyder 2.2.5、IPython 1.2.0、Matplotlib 1.3.1)当我尝试绘制内容时,它会将子图作为微小的内联 PNG,即 change in IPython:
所以我进入了选项,发现了这个:
这似乎是说我可以恢复旧的交互式绘图,并排显示 4 个子绘图,但是当我切换到“自动”并尝试绘制某些东西时,它什么也没做。完全没有情节。
如果我将此下拉菜单切换到 Qt,或取消选中“激活支持”,它只会绘制第一个子图或其中的一部分,然后停止:
如何在可以与之交互的单个图中获得 4 个并排子图的旧行为?
【问题讨论】:
我认为这应该作为对 pythonxy 的错误报告。我天真的猜测是他们正在使用 pyplot 来处理所有的绘图和被咬的事情(这似乎是错误的,因为他们有自己的 qt 小部件)。 @tcaswell 谁是“他们”,他们会用什么来代替 pyplot? 你能在 pythonxy 之外重现这个问题吗(直接使用 ipython + qtconsole)?这里没有足够的信息来解决问题所在。 我猜这是 Spyder 中的一个错误(Spyder 是 IDE,pythonxy 是发行版)。 @tcaswell:啊哈。似乎我的脚本正在产生 matplotlib 错误,然后将这些错误发送到 IPython 控制台以外的其他地方。如果我改用 Qt 控制台,它们就会出现,现在我寻找它,它们会出现在 Spyder 的常规控制台选项卡中。如果我制作一个更简单的脚本,它可以工作,无论是状态机还是面向对象。我认为由于新的内联图,我必须更改一些 IPython 设置。 【参考方案1】:将后端更改为自动:
工具 > 首选项 > IPython 控制台 > 图形 > 图形后端 > 后端:自动
然后关闭并打开 Spyder。
【讨论】:
合盘和开盘确实是必须的。只是想知道为什么这不是默认值。 另外,对于仍然没有看到他们的情节的任何人(就像我没有看到的那样),情节窗口可能会默默地出现在您的控制台窗口后面(至少在 Windows 10 上的 Spyder 中是这样),所以您可能有到处寻找你的窗口。 对于那些找不到这个的人,它位于python > preferences > IPython console > Graphics > Graphics backend > Backend: Automatic
除了重新启动 Spyder,您还可以重新启动内核(通过单击控制台中的设置轮然后“重新启动内核”或通过键盘快捷键(在 Mac Cmd+ 上)。)
我不知道为什么,但更改为自动,重新启动 Spyder,然后更改回内联会导致内联图在我在循环中发出输入命令时开始显示。这很有帮助!【参考方案2】:
您可以通过在 Spyder 的 IPython 控制台中键入 built-in magic commands 来快速控制它,我发现这比从首选项菜单中选择这些要快。更改立即生效,无需重新启动 Spyder 或内核。
要切换到“自动”(即交互式)绘图,请键入:
%matplotlib auto
如果您想切换回“内联”,请输入:
%matplotlib inline
(注意:这些命令在非 IPython 控制台中不起作用)
查看有关此主题的更多背景信息:Purpose of "%matplotlib inline"
【讨论】:
在 Python 3.6 中,我获得了matplotlib inline File "<stdin>", line 1 %matplotlib inline ^ SyntaxError: invalid syntax
@Karlo 传统的“python”解释器会出现错误。此语法仅对 ipython 或 Spyder 有效。
有没有办法使用脚本来设置它?即选择脚本中图形的输出在哪里?谢谢。
这似乎在 Spyder 中不起作用,即使这是在普通 IPython 窗口中执行此操作的方法。使用菜单首选项对我有用;不知道为什么不这样。
@Royi 在文件中包含 IPython 语法的唯一方法是使用 *.ipy
扩展名重命名它;见this Q/A for details【参考方案3】:
应用后:工具>首选项>图形>后端>自动只需重启内核
你会得到互动情节。
【讨论】:
【参考方案4】:正如 cmets 中所说,问题在于您的脚本。其实有两个问题:
有一个 matplotlib 错误,我猜你在某处传递了一个None
的参数。也许是由于 defaultdict ?
您在每个子图之后调用show()
。 show()
应该在脚本结束时调用一次。另一种方法是使用交互模式,在 matplotlib 的文档中查找 ion
。
【讨论】:
【参考方案5】:这实际上很容易修复并且不需要任何编码:
1.单击控制台上方的绘图选项卡。 2.然后在绘图屏幕的右上角单击选项按钮。 3.最后取消勾选“Mute inline plotting”按钮
现在重新运行您的脚本,您的图表应该会显示在控制台中。
【讨论】:
【参考方案6】:对于大多数数学编码,我使用此网站及其服务,因为它们为每个主题提供示例,并且他们的支持非常有帮助:https://labdeck.com/application-examples-screenshots/
如果您希望图表按可变数量进行更改,那么您要使用的代码是
import matplotlib.pyplot as plt
import time
vec1=[1, 2, 3, 4, 5]
vec2py=[10, 12, 9, 11, 13]
plt.show()
axes = plt.gca()
axes.set_xlim(0, 6)
axes.set_ylim(5, 50)
plt.xlabel('x - axis')
plt.ylabel('y - axis')
plt.title('Example 1')
plt.grid()
line,= axes.plot(vec1,vec2py,color='red',lw=1)
for x in range(0,10):
vec2py = [x + 2 for x in vec2py]
line.set_ydata(vec2py)
plt.draw()
plt.pause(1e-17)
time.sleep(0.5)
plt.show()
您必须更改 x 来表示您想要的图形迭代次数以及您希望它运行多长时间,以及 vec2py 行中的 +2 来更改您想要更改它的可变数量。自然地,代码是一个模板,您可以进行任何美观的更改。该代码文件位于以上链接中 python 编程下的显示动态图下。
如果您想显示来自来源的信息的持续依赖,我不确定如何做到这一点,但之前提到的网站确实有一个示例,但它不是在 python 中,而是以简化形式C++。如果您确实想查看它,那么链接是https://labdeck.com/examples/dsp-ecg-processing/ecg-9-leads-graphs.pdf?01a96f&01a96f,它在 ECG 9 Leads graphs in ECG 的开头链接上。 图表可以作为文档显示,也可以独立于文档显示。
PS 这适用于有相同问题但不一定相同场景的人,因为我认为这会更有帮助。
【讨论】:
以上是关于如何在 Spyder/IPython/matplotlib 中再次获得交互式绘图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?