Matplotlib绘制3D统计图

简介: 在2D统计图统计图中再添加一个维度可以展示更多信息。而且,在进行常规汇报或演讲时,3D图形也可以吸引更多的注意力。在本文中,我们将探讨利用Matplotlib绘制三维统计图。

前言

制作 3D 图形的 API 与 2D API 非常相似,我们已经学习了一系列2D统计图的绘制,而在统计图中再添加一个维度可以展示更多信息。而且,在进行常规汇报或演讲时,3D 图形也可以吸引更多的注意力。在本文中,我们将探讨利用 Matplotlib 绘制三维统计图。

3D散点图

3D 散点图的绘制方式与 2D 散点图基本相同。

importnumpyasnpfrommpl_toolkits.mplot3dimportAxes3Dimportmatplotlib.pyplotasplt# 数据生成a, b, c=10., 28., 8./3.deflorenz_map(x, dt=1e-2):
x_dt=np.array([a* (x[1] -x[0]), x[0] * (b-x[2]) -x[1], x[0] *x[1] -c*x[2]])
returnx+dt*x_dtpoints=np.zeros((2000, 3))
x=np.array([.1, .0, .0])
foriinrange(points.shape[0]):
points[i], x=x, lorenz_map(x)
# 绘制fig=plt.figure()
ax=fig.gca(projection='3d')
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.set_title('Lorenz Attractor a=%0.2f b=%0.2f c=%0.2f'% (a, b, c))
ax.scatter(points[:, 0], points[:, 1],points[:, 2], zdir='z', c='c')
plt.show()

绘图108.png

Tips:按住鼠标左键移动鼠标可以旋转查看三维图形将旋转。

为了使用 Matplotlib 进行三维操作,我们首先需要导入 Matplotlib 的三维扩展:

frommpl_toolkits.mplot3dimportAxes3D

对于三维绘图,需要创建一个 Figure 实例并附加一个 Axes3D 实例:

fig=plt.figure()
ax=fig.gca(projection='3d')

之后,三维散点图的绘制方式与二维散点图完全相同:

ax.scatter(points[:, 0], points[:, 1],points[:, 2], zdir='z', c='c')

Tips:需要调用 Axes3D 实例的 scatter() 方法,而非 plt 中的 scatter 方法。只有 Axes3D 中的 scatter() 方法才能解释三维数据。同时 2D 统计图中的注释也可以在 3D 图中使用,例如 set_title()、set_xlabel()、set_ylabel() 和 set_zlabel() 等。

同时可以通过使用 Axes3D.scatter() 的可选参数更改统计通的形状和颜色:

ax.scatter(points[:, 0], points[:, 1],points[:, 2], zdir='z', c='c', marker='s', edgecolor='0.5', facecolor='m')

绘图120.png

3D曲线图

与在 3D 空间中绘制散点图类似,绘制 3D 曲线图同样需要设置一个 Axes3D 实例,然后调用其 plot() 方法:

# 构造数据集a, b, c=10., 28., 8./3.deflorenz_map(x, dt=1e-2):
x_dt=np.array([a* (x[1] -x[0]), x[0] * (b-x[2]) -x[1], x[0] *x[1] -c*x[2]])
returnx+dt*x_dtpoints=np.zeros((8000, 3))
x=np.array([.1, .0, .0])
foriinrange(points.shape[0]):
points[i], x=x, lorenz_map(x)
# Plottingfig=plt.figure()
ax=fig.gca(projection='3d')
ax.plot(points[:, 0], points[:, 1], points[:, 2], c='c')
plt.show()

绘图121.png

3D标量场

到目前为止,我们看到的 3D 绘图方式类似与相应的 2D 绘图方式,但也有许多特有的三维绘图功能,例如将二维标量场绘制为 3D 曲面:

x=np.linspace(-3, 3, 256)
y=np.linspace(-3, 3, 256)
x_grid, y_grid=np.meshgrid(x, y)
z=np.sinc(np.sqrt(x_grid**2+y_grid**2))
fig=plt.figure()
ax=fig.gca(projection='3d')
ax.plot_surface(x_grid, y_grid, z, cmap=cm.viridis)
plt.show()

绘图110.png

Tips: plot_surface() 方法使用 x、y 和 z 将标量场显示为三维曲面。

可以看到曲面上线条带有显著色彩,如果不希望看到三维曲面上显示的曲线色彩,可以使用 plot_surface() 附加可选参数:

ax.plot_surface(x_grid, y_grid, z, cmap=cm.viridis, linewidth=0, antialiased=False)

绘图111.png

同样,我们也可以仅保持曲线色彩,而曲面不使用其他颜色,这也可以通过 plot_surface() 的可选参数来完成:

x=np.linspace(-3, 3, 256)
y=np.linspace(-3, 3, 256)
x_grid, y_grid=np.meshgrid(x, y)
z=np.sinc(np.sqrt(x_grid**2+y_grid**2))
fig=plt.figure()
ax=fig.gca(projection='3d')
ax.plot_surface(x_grid, y_grid, z, edgecolor='b',color='w')
plt.show()

绘图109.png

而如果我们希望消除曲面,而仅使用线框进行绘制,这可以使用 plot_wireframe() 函数:

ax.plot_wireframe(x_grid, y_grid, z, cstride=10, rstride=10,color='c')

绘图117.png

Tips:plot_wireframe() 参数与 plot_surface() 相同,使用两个可选参数 rstride 和 cstride 用于令 Matplotlib 跳过x和y轴上指定数量的坐标,用于减少曲线的密度。

绘制3D曲面

在前述方法中,使用 plot_surface() 来绘制标量:即 f(x, y)=z 形式的函数,但 Matplotlib 也能够使用更通用的方式绘制三维曲面:

# 数据生成angle=np.linspace(0, 2*np.pi, 32)
theta, phi=np.meshgrid(angle, angle)
r, r_w=.25, 1.x= (r_w+r*np.cos(phi)) *np.cos(theta)
y= (r_w+r*np.cos(phi)) *np.sin(theta)
z=r*np.sin(phi)
# 绘制fig=plt.figure()
ax=fig.gca(projection='3d')
ax.set_xlim3d(-1, 1)
ax.set_ylim3d(-1, 1)
ax.set_zlim3d(-1, 1)
ax.plot_surface(x, y, z, color='c', edgecolor='m', rstride=2, cstride=2)
plt.show()

绘图123.png

同样可以使用 plot_wireframe() 替换对 plot_surface() 的调用,以便获得圆环的线框视图:

ax.plot_wireframe(x, y, z, edgecolor='c', rstride=2, cstride=1)

绘图113.png

在3D坐标轴中绘制2D图形

注释三维图形的一种有效方法是使用二维图形:

x=np.linspace(-3, 3, 256)
y=np.linspace(-3, 3, 256)
x_grid, y_grid=np.meshgrid(x, y)
z=np.exp(-(x_grid**2+y_grid**2))
u=np.exp(-(x**2))
fig=plt.figure()
ax=fig.gca(projection='3d')
ax.set_zlim3d(0, 3)
ax.plot(x, u, zs=3, zdir='y', lw=2, color='m')
ax.plot(x, u, zs=-3, zdir='x', lw=2., color='c')
ax.plot_surface(x_grid, y_grid, z, color='b')
plt.show()

绘图114.png

Axes3D 实例同样支持常用的二维渲染命令,如 plot():

ax.plot(x, u, zs=3, zdir='y', lw=2, color='m')

Axes3D 实例对 plot() 的调用有两个新的可选参数:

  • zdir:用于决定在哪个平面上绘制2D绘图,可选值包括 x、y 或 z ;
  • zs:用于决定平面的偏移。

因此,要将二维图形嵌入到三维图形中,只需将二维原语用于 Axes3D 实例,同时使用可选参数,zdir 和 zs,来放置所需渲染图形平面。  

接下来,让我们实际查看下在 3D 空间中堆叠 2D 条形图的示例:

importnumpyasnpfrommatplotlibimportcmimportmatplotlib.colorsascolfrommpl_toolkits.mplot3dimportAxes3Dimportmatplotlib.pyplotasplt# 数据生成alpha=1./np.linspace(1, 8, 5)
t=np.linspace(0, 5, 16)
t_grid, a_grid=np.meshgrid(t, alpha)
data=np.exp(-t_grid*a_grid)
# 绘制fig=plt.figure()
ax=fig.gca(projection='3d')
cmap=cm.ScalarMappable(col.Normalize(0, len(alpha)), cm.viridis)
fori, rowinenumerate(data):
ax.bar(4*t, row, zs=i, zdir='y', alpha=0.8, color=cmap.to_rgba(i))
plt.show()

绘图116.png

相关文章
|
数据可视化 Python
【100天精通Python】Day67:Python可视化_Matplotlib 绘制动画,2D、3D 动画 示例+代码
【100天精通Python】Day67:Python可视化_Matplotlib 绘制动画,2D、3D 动画 示例+代码
412 0
【100天精通Python】Day67:Python可视化_Matplotlib 绘制动画,2D、3D 动画 示例+代码
|
数据可视化 Python
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
352 0
|
数据可视化 关系型数据库 Python
【100天精通Python】Day66:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码
【100天精通Python】Day66:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码
203 0
|
数据可视化 API Python
高级 Matplotlib:3D 图形和交互性
Matplotlib 是 Python 中最重要的数据可视化库之一。在之前的文章中,我们讨论了如何使用基础和中级功能来创建各种图形。在本文中,我们将深入研究 Matplotlib 的高级特性,特别是如何创建 3D 图形和交互式图形。
|
大数据 Python
matplotlib Basemap的3d效果
matplotlib Basemap的3d效果
140 0
|
存储 人工智能 数据可视化
Python Matplotlib库:统计图补充
上两期我们讲了 Matplotlib 库的基本语法和基本绘图展示。这期我们来说说如何用 Matplotlib 库绘制常用统计图。用hist()方法来绘制直方图。用boxplot()方法来绘制箱线图。用errorbar()方法来绘制误差条图。用violinplot()方法来绘制小提琴图。用eventplot()方法来绘制尖峰栅格图。用hist2d()方法来绘制二维直方图/散点密度图。用hexbin()方法来绘制Hexbin散点图。用pie()方法来绘制扇形图。
240 0
Python Matplotlib库:统计图补充
|
数据可视化 Python
可视化库Matplotlib-折线统计图
可视化库Matplotlib-折线统计图
可视化库Matplotlib-折线统计图
|
Python
python matplotlib绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)
python matplotlib绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)
1502 0
python matplotlib绘制 3D图像专题 (三维柱状图、曲面图、散点图、曲线图合集)
|
Python
Matplotlib自定义统计图比例
图形的比例对于统计图而言至关重要,好的图形比例可以让人方便的获取图形中相关数据间的关系,因此设置图形比例对于统计图而言是至关重要的,本文介绍如何使用Maplotlib修改统计图比例。
1454 0
Matplotlib自定义统计图比例
|
Python
Matplotlib自定义样式绘制精美统计图
matplotlib提供的所有绘图都带有默认样式,但有时需要自定义绘图的颜色和样式,以绘制更加符合审美要求的图像。matplotlib的设计考虑到了此需求,很容易调整matplotlib图形的样式。
820 0
Matplotlib自定义样式绘制精美统计图