在 IPython 或 Jupyter Notebook 中显示可旋转的 3D 图
Posted
技术标签:
【中文标题】在 IPython 或 Jupyter Notebook 中显示可旋转的 3D 图【英文标题】:Displaying rotatable 3D plots in IPython or Jupyter Notebook 【发布时间】:2016-01-30 21:25:35 【问题描述】:(Mac OSX 10.10.5)
我可以从 matplotlib 网站 mplot3d 复制 3D 散点图 scatter3d_demo.py 的示例代码,但是该图呈现为静态图像。我无法单击图形并动态旋转以查看 3D 绘制数据。
我已经使用示例代码实现了静态 3D 绘图 - 使用 (a) 终端内的 ipython,(b) 终端内的 ipython 笔记本,以及 (c) 从 Anaconda 启动器启动的 ipython 笔记本。
我认为我缺少一些非常基本的步骤作为假设的知识。
在过去的学习中,绘图打开了一个带有图形查看器的 GUI Python App。 (下面显示的代码中的解决方案 2 会打开它。)也许我需要知道将输出图导出到该显示方法的代码? (是的,使用 %matplotlib(仅)作为第一行,没有内联或笔记本,如下面代码块中的 cmets 所示。)
以 ipython notebook 为例:
# These lines are comments
# Initial setup from an online python notebook tutorial is below.
# Note the first line "%matplotlib inline" this is how the tutorial has it.
# Two solutions 1. use: "%matplotlib notebook" graphs appear dynamic in the notebook.
# 2. use: "%matplotlib" (only) graphs appear dynamic in separate window.
# ( 2. is the best solution for detailed graphs/plots. )
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
pd.set_option('html',False)
pd.set_option('max_columns',30)
pd.set_option('max_rows',10)
# What follows is a copy of the 3D plot example code.
# Data is randomly generated so there is no external data import.
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', -60, -25), ('b', '^', -30, -5)]:
xs = randrange(n, 23, 50)
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()
有人能找出我缺少的东西吗?
查看 Python 3.3.6 文档,第 25.1 节可能是 tkinter 包 ...
tkinter 包(“Tk 接口”)是 Tk GUI 工具包的标准 Python 接口。 Tk 和 tkinter 在大多数 Unix 平台以及 Windows 系统上都可用。
不过,我认为这与 GUI 程序的开发有关,所以我不确定这是否相关。 (正确,解决方案不需要。)
【问题讨论】:
尝试添加对ax.mouse_init()
的呼叫
OK,在 plt.show() 之前在哪里?
我不确定这是否重要,但这就是我要说的地方。
好的,谢谢。我在这里试过了,没有用。我刚刚在我原来的问题中添加了一个可能的解决方案的新方向。
@Matt Nice tidy 编辑了这个问题。谢谢。我想这是我加入 SO 的第一篇文章。
【参考方案1】:
使用 %matplotlib notebook
而不是 %matplotlib inline
在 IPython 笔记本中获取嵌入式交互式图形 - 这需要最新版本的 matplotlib (1.4+) 和 IPython (3.0+)。
【讨论】:
是的,就是这样。感谢 jakevdp。对于没有使用 ipython notebook 的经验,并使用在线示例学习的其他人,在将%matplotlib inline
更改为 %matplotlib notebook
时,也可以转到菜单 Cell,然后选择 Run All。
冒着增加原始问题的风险,您知道如何在自己的独立窗口中打开这样的图表。一些包含大量数据的图表需要很大才能进行全面检查。能够做到这一点,并让它们动态、可旋转,将是最好的解决方案。这个 ipython notebook 环境中是否存在这种情况?
如果您只是单独调用%matplotlib
,它将使用您系统的默认后端(假设在安装时已正确配置)并在新窗口中打开该图。
是的,又是这样。我将更新问题以包含此解决方案。
使用%pylab
是not recommended。请改用%matplotlib
和显式导入。【参考方案2】:
对于 Colab 环境,我发现 HTML() 函数最有用:
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from numpy.random import rand
from IPython.display import HTML
from matplotlib import animation
m = rand(3,3) # m is an array of (x,y,z) coordinate triplets
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(len(m)): # plot each point + it's index as text above
x = m[i,0]
y = m[i,1]
z = m[i,2]
label = i
ax.scatter(x, y, z, color='b')
ax.text(x, y, z, '%s' % (label), size=20, zorder=1, color='k')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
def animate(frame):
ax.view_init(30, frame/4)
plt.pause(.001)
return fig
anim = animation.FuncAnimation(fig, animate, frames=200, interval=50)
HTML(anim.to_html5_video())
【讨论】:
【参考方案3】:对于 Windows(我是 Windows 8.1),您可以使用
%matplotlib inline
%matplotlib notebook
%pylab
改为。
注意:你必须同时执行所有三个命令,否则你会得到一个kernal dead错误,然后笔记本会自动重启。
【讨论】:
【参考方案4】:对于像我这样不太熟悉的人,快速回答是:
%matplotlib(高于导入)(用于新窗口中的交互式图表)
导入matplot...等
%matplotlib notebook(用于 JupyterNotebook 本身内的图形交互
导入等...
导入等...
【讨论】:
查看 OP 问题的顶部【参考方案5】:在 Windows 上,我可以通过以下方式启动笔记本,使绘图以交互模式显示:
from matplotlib import use
use("Qt5Agg")
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
...
如果需要,请关闭您的笔记本并重新启动它。
【讨论】:
这是在 Pycharm 上对我有用的唯一解决方案。谢谢!【参考方案6】:添加后:
%matplotlib inline
%matplotlib notebook
%pylab
如果一切仍为 2D,您只需使用此选项(在第二张图像上为红色)拖动和旋转图形,您的 3D 图像就会显示出来:
之前:
之后:
我使用的是 Windows 10 和 Jupyter Notebook 6.0.2。
【讨论】:
以上是关于在 IPython 或 Jupyter Notebook 中显示可旋转的 3D 图的主要内容,如果未能解决你的问题,请参考以下文章
如何腌制或存储 Jupyter (IPython) 笔记本会话以供以后使用
如何获得IPython或Jupyter笔记本中最近执行的'执行计数'
在 IPython 或 Jupyter Notebook 中显示可旋转的 3D 图
在 ipython/Jupyter notebook 中导入 scikit-learn