如何利用Pandas DataFrame绘制准确的Matplotlib 3D柱状图?
3D柱状图绘制问题修正方案
原代码存在的问题
- 未定义变量:
row、xposM、yposM直接调用会引发报错 - 坐标映射错误:y轴应对应每个Item所属的Action类别编码,而非数据集列数
- Z轴数据错误:
dz未正确读取Cost列数据 - 颜色逻辑混乱:颜色拼接方式不符合分类需求,导致颜色分配错误
- Z轴范围设置不合理:原数据中存在Cost=4587,但设置
zlim(0,4000)会截断最高柱子,显示不准确
修正后的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import matplotlib.cm as cm # 读取数据集 data = pd.read_csv('datadata.csv') # 对Action进行编码,映射为y轴坐标 action_codes = {'UK': 0, 'USA': 1, 'China': 2} data['Action_Code'] = data['Action'].map(action_codes) # 设置3D柱状图的坐标参数 xpos = np.arange(data.shape[0]) # x轴对应每个Item的索引 ypos = data['Action_Code'].values # y轴对应每个Item的Action编码 zpos = np.zeros(data.shape[0]) # 柱子底部都在z=0处 dx = 0.5 * np.ones_like(zpos) # x方向宽度 dy = 0.5 * np.ones_like(zpos) # y方向宽度,调大一点更美观 dz = data['Cost'].values # z轴高度对应Cost数值 # 创建画布和3D轴 fig = plt.figure(figsize=(12, 9)) ax = fig.add_subplot(111, projection='3d') # 根据Action类别分配颜色 cmap_dict = {'UK': cm.Blues, 'USA': cm.Reds, 'China': cm.Greens} colors = [] for action in data['Action']: # 为每个Action生成渐变颜色,取中间值附近的颜色增强辨识度 color = cmap_dict[action](0.6) colors.append(color) # 绘制3D柱状图 ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color=colors, alpha=0.7) # 设置坐标轴标签 ax.set_xlabel('Item', fontsize=12) ax.set_ylabel('Action', fontsize=12) ax.set_zlabel('Cost', fontsize=12) # 设置坐标轴刻度和标签 ax.set_xticks(xpos + dx/2) # 让刻度对齐柱子中心 ax.set_xticklabels(data['Item'], rotation=45, ha='right') ax.set_yticks(np.unique(ypos)) ax.set_yticklabels(action_codes.keys()) # 设置坐标轴范围,Z轴包含最大Cost值 ax.set_xlim(-0.5, data.shape[0]-0.5) ax.set_ylim(-0.5, 2.5) ax.set_zlim(0, data['Cost'].max() + 200) # 留余量避免柱子顶到边界 # 调整视角,提升3D图表可读性 ax.view_init(elev=20., azim=-60) plt.tight_layout() plt.show()
修正关键点说明
- 坐标映射:将Action类别编码为0/1/2,每个Item对应唯一的y轴位置,确保分类准确
- Z轴数据:直接读取
data['Cost'].values作为柱子高度,完全还原原始数据 - 颜色分配:针对每个Action类别使用专属颜色映射,分类边界清晰
- 坐标轴优化:调整刻度位置对齐柱子中心,Z轴范围覆盖最大Cost值,避免柱子被截断
- 视角调整:通过
view_init设置合适的仰角和方位角,减少3D图表的视觉遮挡
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

