7

我正在关注 Wes McKinney 的一本书,在介绍 pandas 的部分中,他给出了一个绘制 pandas Data Frame 的简单示例。这是我写的行:

tz_counts = frame['tz'].value_counts() # frame is a Data Frame
tz_counts[:10] # works fine till here. I can see the key-value I wanted
tz_counts[:10].plot(kind='barh', rot=0)

它只是在屏幕上打印一行,上面写着

<matplotlib.axes.AxesSubplot object at 0x3d14ed0>

而不是像我期望的那样使用 matplotlib 的绘图功能显示绘图窗口。这里有什么问题?我怎样才能让它工作?

4

2 回答 2

14

除非您处于“交互”模式,否则 Matplotlib 在您告诉它之前不会显示绘图。

简短回答plt.show():当你准备好显示情节时 打电话。

这将启动您正在使用的任何后端的 gui 主循环,因此它是阻塞的。(即执行将停止,直到您关闭窗口)

如果您希望它在不停止执行的情况下自动显示,您可以使用plt.ion()使用ipython --pylab.


但是,--pylab在 ipython 中使用模式会将所有 numpy、matplotlib.pyplot 和其他一些内容导入到全局命名空间中。这对交互使用很方便,但会教人非常坏的习惯并覆盖标准库中的函数(例如min,max等)。

您仍然可以在 ipython 中使用 matplotlib 的交互模式,而无需使用“pylab”模式来避免全局导入。打电话plt.ion()

Matplotlib 的默认TkAgg后端将在交互模式下与任何 python shell(不仅仅是ipython)一起工作。但是,如果没有在单独的线程中运行 gui 主循环,其他后端无法避免阻止进一步的执行。如果您使用不同的后端,那么您需要通过选项来说明ipython这一点。--gui=<backend>

于 2013-09-18T20:20:15.463 回答
1

尝试使用:

%matplotlib 
tz_counts = frame['tz'].value_counts()
tz_counts[:10].plot(kind='barh', rot=0)

使用 % matplotlib 可以防止从 pylab 和 numpy 导入 *,从而防止变量破坏。

于 2016-12-19T07:04:24.893 回答