如何用Matplotlib绘制3D圆柱柱状图而非方形柱状图?
关于Matplotlib绘制3D圆柱状柱状图的问题
原生支持情况
Matplotlib没有原生提供直接绘制3D圆柱状柱状图的函数,默认的Axes3D.bar()只能生成你提到的方形柱体样式。
实现方法
要做出圆柱状的3D柱状图,需要手动创建圆柱模型并添加到3D坐标轴中,核心思路是逐个数据点生成圆柱的底面、顶面和侧面,以下是一个可运行的示例代码:
import matplotlib.pyplot as plt from matplotlib.patches import Circle from mpl_toolkits.mplot3d import art3d import numpy as np # 准备示例数据 x = np.array([0, 1, 2]) y = np.array([0, 1, 2]) z = np.array([3, 5, 4]) radius = 0.3 # 控制圆柱粗细 # 创建3D画布 fig = plt.figure() ax = fig.add_subplot(projection='3d') # 遍历每个数据点绘制圆柱 for xi, yi, zi in zip(x, y, z): # 绘制圆柱底面 circle_bottom = Circle((xi, yi), radius, color='cornflowerblue') ax.add_patch(circle_bottom) art3d.pathpatch_2d_to_3d(circle_bottom, z=0, zdir='z') # 绘制圆柱顶面 circle_top = Circle((xi, yi), radius, color='cornflowerblue') ax.add_patch(circle_top) art3d.pathpatch_2d_to_3d(circle_top, z=zi, zdir='z') # 绘制圆柱侧面 theta = np.linspace(0, 2*np.pi, 50) xs = xi + radius * np.cos(theta) ys = yi + radius * np.sin(theta) # 连接底面和顶面的竖线 for i in range(len(theta)-1): ax.plot3D([xs[i], xs[i]], [ys[i], ys[i]], [0, zi], color='cornflowerblue') # 设置坐标轴范围和标签 ax.set_xlim(-0.5, 2.5) ax.set_ylim(-0.5, 2.5) ax.set_zlim(0, max(z)+1) ax.set_xlabel('X轴') ax.set_ylabel('Y轴') ax.set_zlabel('Z轴') plt.show()
额外说明
- 调整
radius参数可以改变圆柱的粗细 - 如果需要更平滑的侧面,也可以用
plot_surface方法生成曲面替代竖线 - 圆柱的颜色、透明度等样式可以通过修改
color、alpha参数调整
内容的提问来源于stack exchange,提问作者Katono
相关产品推荐
相关产品推荐

