使用ipython笔记本的Matplotlib窗口档位

时间:2016-06-25 14:51:11

标签: matplotlib ipython-notebook jupyter-notebook mpld3

ipython notebook 3.0.0

matplotlib 1.4.3

OS X 10.11.4

我正在创建3D数据立方体的交互式三维散点图。 我在这里包含了一个玩具示例,它会产生与我试图绘制数据立方体时遇到的相同问题。

如果我在笔记本外部生成一个matplot窗口,当我手动关闭它(点击红色x)时,它会停止“轮子”,直到我强制退出。

#Generate matplot window outside of the notebook

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

#from matplot3d tutorial

def randrange(n, vmin, vmax):
    return (vmax - vmin)*np.random.rand(n) + vmin

fig = plt.figure() ax = fig.add_subplot(111, projection='3d') n = 100 for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
    xs = randrange(n, 23, 32)
    ys = randrange(n, 0, 100)
    zs = randrange(n, zl, zh)
    ax.scatter(xs, ys, zs, c=c, marker=m)

ax.set_xlabel('X Label') ax.set_ylabel('Y Label') ax.set_zlabel('Z Label')

plt.show()

我尝试在笔记本中使用mpld3,但显示非交互式图像以及错误

“TypeError:array([2.,20.])不是JSON可序列化的”

#Use mpld3 within notebook

import matplotlib.pyplot as plt
import numpy as np
import mpld3
from mpl_toolkits.mplot3d import Axes3D
mpld3.enable_notebook()

def randrange(n, vmin, vmax):
    return (vmax - vmin)*np.random.rand(n) + vmin

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 100
for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
    xs = randrange(n, 23, 32)
    ys = randrange(n, 0, 100)
    zs = randrange(n, zl, zh)
    ax.scatter(xs, ys, zs, c=c, marker=m)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

对JSON序列化的一些快速研究并不富有成效。

创建不会停滞的交互式3D matplotlib散点图的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

在IPython中,即使您没有使用内联后端,也最好使用%matplotlib。这告诉IPython和matplotlib与eventloops一起工作,应该有助于挂起。要使用默认的GUI后端,请使用:

%matplotlib

或者指定qt后端:

%matplotlib qt

这样可以避免在绘制绘图时需要plt.show()和内核阻塞。

为了获得最佳效果,请在任何绘图命令之前在笔记本的第一个单元格中自行运行。