Python Matplotlib绘制3D柱形图完整指南
本文详细介绍如何使用Python的Matplotlib库绘制3D柱形图。通过numpy生成网格数据,利用bar3d函数设置X、Y坐标及Z轴高度,并解析shade参数对立体效果的影响。文章提供完整源代码及多子图绘制示例,帮助开发者快速掌握3D图表制作技巧。
Python绘制3D柱形图概述
本文主要介绍如何利用Python语言绘制三维柱形图,效果参考下图所示。

基础代码实现与数据构建
具体实现代码如下:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#构造需要显示的值
X=np.arange(0, 5, step=1)#X轴的坐标
Y=np.arange(0, 9, step=1)#Y轴的坐标
#设置每一个(X,Y)坐标所对应的Z轴的值,在这边Z(X,Y)=X+Y
Z=np.zeros(shape=(5, 9))
for i in range(5):
for j in range(9):
Z[i, j]=i+j
xx, yy=np.meshgrid(X, Y)#网格化坐标
X, Y=xx.ravel(), yy.ravel()#矩阵扁平化
bottom=np.zeros_like(X)#设置柱状图的底端位值
Z=Z.ravel()#扁平化矩阵
width=height=1#每一个柱子的长和宽
#绘图设置
fig=plt.figure()
ax=fig.gca(projection='3d')#三维坐标轴
ax.bar3d(X, Y, bottom, width, height, Z, shade=True)#
#坐标轴设置
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(value)')
plt.show()
坐标设置与网格化处理
以下是对代码逻辑的详细解读:
第一步,构建待展示的数据集。
如上图所示,X轴坐标取值范围为[0, 1, 2, 3, 4],Y轴坐标取值范围为[0, 1, 2, 3, 4, 5, 6, 7, 8]。每个(X, Y)组合对应的Z值由公式Z=X+Y计算得出。绘图的核心逻辑是在X和Y确定的坐标位置上,依据Z值的高度绘制对应的柱形。

第二步,进行坐标系的设置。
首先对坐标进行网格化处理,其中X=[0, 1, 2, 3, 4],Y=[0, 1, 2, 3, 4, 5, 6, 7, 8]。网格化后的结果如上图所示。从原理上看,这相当于X参照Y进行了广播(broadcast),同时Y参照X也进行了广播,两者各自增加了一个新维度并执行复制操作。结合xx和yy即可得到所有可能的X、Y坐标组合,经扁平化处理后,这种对应关系依然保持。代码中的bottom参数用于设定每个柱子在Z轴方向的起始位置,此处统一设为0;width和height参数则分别定义每个柱子的长度和宽度。

bar3d函数参数详解
第三步,调用bar3d函数进行绘制。
ax.bar3d(X, Y, bottom, width, height, Z, shade=True)函数的参数含义如下: - X、Y:定义柱子在XY平面上的起始坐标。 - bottom:定义柱子在Z轴方向上的起始高度。 - width、height:定义柱子的长和宽尺寸。 - Z:定义柱子沿Z轴延伸的长度(即高度)。 - shade:布尔值,决定是否显示阴影。设置为True时,立体视觉效果更佳。
当shade=True时,渲染效果如下:

当shade=False时,渲染效果如下:

多子图3D柱形图绘制示例
若需绘制包含多个子图的界面,且每个子图均为3D柱形图,只需对前述代码稍作调整。具体案例代码如下:
fig=plt.figure()
ax=fig.add_subplot(1, 3, 1, projection='3d')
ax.bar3d(x, y, z, width, height, top, shade=True)
ax=fig.add_subplot(1, 3, 2, projection='3d')
ax.bar3d(x, y, z, width, height, top2, shade=True)
ax=fig.add_subplot(1, 3, 3, projection='3d')
ax.bar3d(x, y, z, width, height, top3, shade=True)
plt.show()
以上即为使用Python绘制3D柱形图的完整教程,更多Python绘图相关内容可关注本站其他文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













