使用Python Tools for Visual Studio在Visual Studio中使用Matplotlib进行绘图

11

我刚开始使用PTVS来编写Python代码,之前我使用的是Spyder,因为它与Anaconda一起分发。我的问题是,我想创建两个绘图,并将它们同时显示在不同的窗口中。以下是一个简单的示例:

import matplotlib.pyplot as plt 
plt.plot([1,2,3,4,5]) 
plt.show() 
plt.plot([2,2,2,2,2]) 
plt.show()

但第二个图只有在我关闭第一个图后才会显示。类似地,对于更大的脚本,在plt.show()之后的其余代码块如果我不关闭图形也不会执行。我尝试了没有调试执行它,但它不起作用。然而,当我在Ipython交互窗口中运行相同的代码时,所有代码都能执行,我可以看到两个图像都是内联的,但这不是我想要的。我希望所有的代码都能够运行,并在不同的窗口中创建尽可能多的图像,而无需中断或关闭任何一个图像,就像Spyder一样。但是我想完全切换到Visual Studio,这个问题正在困扰我。

任何帮助将不胜感激。谢谢!

4个回答

9

现在我不知道这在VS中如何实现,但每当我需要在交互窗口中制作多个图表(而不保存它们),并且想要将它们全部一起显示时,我会这样做:

fig, ax = plt.subplots()
ax.plot([1,2,3,4,5])
fig1, ax1 = plt.subplots()
ax1.plot([1,2,3,4,5])
plt.show()

请注意,在plt.show()之后,您将会被固定在原地。要有一个既能进行交互又不会阻碍其余代码的窗口,您需要使用IPython或其他启用异步绘图和计算的工具。但是,在Python解释器中直接运行,则必须等待该行代码执行完毕。
此外,您可以通过在任何其他操作之前执行plt.ion()来打开交互模式。这使您能够直接查看绘图,当您发出与其相关的命令时,它也会更新。
我相信这就是您正在寻找的实际命令。 这里是手册

1
以前从未听说过 #ion 方法,非常有用。谢谢。 - erik-e
@erik-e 是的,没错。不过有时候它会有点棘手,因为有时候情节更新不及时。虽然我已经有一段时间没有使用它了,也许现在已经变得更好了。 - ljetibo
谢谢回复。我正在使用的交互式窗口已经是Ipyhton了。我没有内联绘图的问题,我的问题出现在我想要将绘图显示在单独的窗口而不是内联时。在我关闭弹出的第一个绘图窗口之前,其余代码不会执行。 - kdemirtas
@kdemirtas_ 啊,是的。那很可能就是你的问题了。IPython REPL 很可能被设计成与标准 IPython Notebooks 中的 %pylab 魔法函数相同。这基本上执行了 from pylab import *(然后还有一些其他操作,比如拦截调用和内联图形等),并不是按照你想要的方式来使用的。如果你启动“正常”的 Python IDE,plt.ion() 应该会更符合预期。我建议你先尝试使用 virtualenv,我相信这将允许你从 IPy 中提取最大的价值(因为这两个示例在我的 win7 venv 中都可以工作)。祝你好运。 - ljetibo
1
如果您正在使用ion,那么最好为REPL禁用IPython模式 - 这将关闭绘图内嵌等功能。 - Pavel Minaev
显示剩余2条评论

6

我没有在Visual Studio中尝试过这个,但是你可以使用Matplotlib中的非阻塞调用showdraw方法不会阻塞,但是如果你没有通过执行show来结束调用,则图形窗口将立即关闭。

import matplotlib.pyplot as plt
plt.figure(1)
plt.plot([1,2,3,4,5]) 
plt.show(block=False)

# Create a new figure to show the extra information.
# http://matplotlib.org/users/pyplot_tutorial.html#working-with-multiple-figures-and-axes
plt.figure(2)
plt.plot([2,2,2,2,2]) 
plt.show()

这是一个关于相同主题的相关问题
个人建议使用subplots,如matplotlib示例所示。

你好@erik-e,不幸的是当我使用draw方法时,两个图形都显示在同一个窗口中作为两条不同颜色的线。我希望每个图形有一个单独的窗口。 - kdemirtas
啊,抱歉我误解了。我会更新我的答案,以显示两个图形,这将会在不同的窗口中打开。更新后的答案可能无法在所有版本的python/matplotlib上运行。 - erik-e

1

您是想在自己的脚本中运行,还是在Python交互窗口中运行?

如果是后者,则应该在“工具” -> “选项” -> “Python工具” -> “交互式窗口” -> “交互模式”(默认为“标准”)中启用IPython模式。将其更改为“IPython”,并确保在“显示设置”组合框中选择了正确的Python,如果安装了多个Python。然后您将不需要使用plt.show,因为plt.plot会立即在交互式窗口内联显示图。


谢谢你的回答,Pavel。我正在尝试在我的脚本中实现它。你的回复是有效的,但不是我想要的。我不想让图表内联显示,而是想让它显示为一个单独的窗口。 - kdemirtas
我建议在这种情况下使用subplot方法,正如另一个答案所描述的那样。 - Pavel Minaev

0

我可以向您推荐一个我为类似原因而工作的开源工具。我想在调试时一次看到一个接一个的图形,而不必处理关闭窗口或特定环境等问题...

这个答案并没有直接帮助您解决Matplotlib的问题,但提供了解决相同问题的替代方法。我发现Matplotlib或IPython等工具的问题通常是它们通常非常限制于某些环境(例如在您的情况下,IDE)。此外,这些工具通常很难控制以满足您自己的显示要求(或需要更多时间)。

HypnoLog 可以帮助您绘制来自Python或任何其他语言的任何数据。它将在Web浏览器中显示图形,一页接一页地显示(就像日志一样)。由于HypnoLog使用浏览器来显示图形,因此您可以轻松地使用Web上可用的任何其他工具来显示图形或创建自己的工具。

特别针对Python,已经有了一个语言包装器,请参见HypnoLog-Python。要绘制数值数组,可以使用内置可视化plot

这是Python中的样子:

import hypnolog as HL
HL.log([1,2,3,4,5], 'plot');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接