📜  在 Jupyter Notebook 中制作 3D 交互式 Matplotlib 绘图(1)

📅  最后修改于: 2023-12-03 15:23:11.628000             🧑  作者: Mango

在 Jupyter Notebook 中制作 3D 交互式 Matplotlib 绘图

在Jupyter Notebook中,我们可以使用Matplotlib和一些其它库来制作3D交互式绘图。下面,我们将介绍如何使用这些工具创建令人惊叹的可视化效果。

准备工作

在开始之前,我们需要确保安装了必要的库。在Jupyter Notebook中,最好使用conda或pip来安装这些库。打开一个终端或命令提示符并输入下面的命令:

conda install matplotlib numpy pandas ipywidgets

或者

pip install matplotlib numpy pandas ipywidgets

其中,ipywidgets是实现交互性的关键库。

制作一个简单的3D散点图

我们从一个简单的例子开始:制作一个3D散点图来显示两个变量之间的关系。下面是代码:

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x = np.random.standard_normal(100)
y = np.random.standard_normal(100)
z = np.random.standard_normal(100)

ax.scatter(x, y, z)

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

plt.show()

在这个例子中,我们使用numpy库生成了100个随机点,并使用matlplotlib库的scatter方法将它们绘制成了一个3D散点图。我们还设置了轴标签,以及打开了交互模式(首行的%matplotlib widget命令)。

你应该可以在Notebook中看到一个3D散点图,并且使用鼠标进行旋转和缩放。

制作一个3D表面图

3D表面图是另一种流行的可视化效果,可以帮助我们更好地理解数据之间的关系。下面是一个示例代码:

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x, y = np.mgrid[-5:5:50j, -5:5:50j]
z = np.sin(np.sqrt(x**2 + y**2))

ax.plot_surface(x, y, z, cmap='viridis')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

在这个例子中,我们使用numpy库的mgrid函数生成了一个二维的网格,然后使用matplotlibplot_surface方法将网格渲染成一个3D表面图。我们还使用viridis颜色映射来着色。

添加交互性

我们还可以通过添加滑块和按钮等小部件来增加交互性。下面是一个例子,其使用ipywidgets库创建了一个滑块,当更改滑块值时,图表将实时更新:

%matplotlib widget

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

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

x, y = np.mgrid[-5:5:50j, -5:5:50j]
z = np.sin(np.sqrt(x**2 + y**2) * np.pi)

surface = ax.plot_surface(x, y, z, cmap='viridis')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

slider = widgets.FloatSlider(min=0, max=1, step=0.01, value=1)
def update_plot(value):
    z = np.sin(np.sqrt(x**2 + y**2) * np.pi * value)
    surface.set_array(z.ravel())
    fig.canvas.draw_idle()
    
widgets.interact(update_plot, value=slider)

plt.show()

我们首先创建了一个FloatSlider小部件,并定义了一个回调函数update_plot。当回调函数被调用时,它将计算出一个新的z数组,并将其设置为3D表面图的高度(通过set_array方法),然后重新绘制图表(通过draw_idle方法)。

最后,我们使用ipywidgetsinteract函数将回调函数绑定到滑块上,实现了交互效果。

总结

在本文中,我们介绍了如何在Jupyter Notebook中使用Matplotlib和其他库创建3D交互式绘图。我们了解了如何制作3D散点图和3D表面图,并演示了如何增加交互性。希望这些示例能帮助你更好地理解这些工具的用法,并在未来的项目中发挥作用。