如何用Matplotlib绘制Excel中的指定样式3D图表
用Matplotlib绘制匹配Excel样式的3D分组柱状图
你要实现的是3D分组柱状图,Matplotlib没有直接的一键生成API,但可以通过手动调整柱子位置来复刻Excel的样式,以下是具体实现步骤和代码:
核心思路
通过bar3d函数手动控制每个柱子的X、Z轴位置,给同Data类别下的不同V类别柱子添加偏移量避免重叠,同时调整视角和刻度让图表贴近Excel效果。
完整代码示例
import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import Patch # 1. 准备数据(替换成你的实际数据) x_categories = ['Data1', 'Data2', 'Data3'] z_categories = ['V1', 'V2', 'V3'] # 数值矩阵:行对应Data类别,列对应V类别 value_matrix = np.array([ [10, 15, 8], # Data1的V1/V2/V3数值 [12, 9, 14], # Data2的V1/V2/V3数值 [7, 18, 11] # Data3的V1/V2/V3数值 ]) # 2. 设置柱子尺寸与位置参数 bar_width = 0.25 # X轴方向柱子宽度 bar_depth = 0.25 # Z轴方向柱子深度 x_indices = np.arange(len(x_categories)) # Data类别的索引位置 z_indices = np.arange(len(z_categories)) # V类别的索引位置 colors = ['#1f77b4', '#ff7f0e', '#2ca02c'] # 对应V1/V2/V3的柱子颜色 # 3. 创建3D绘图对象 fig = plt.figure(figsize=(10, 7)) ax = fig.add_subplot(111, projection='3d') # 4. 循环绘制所有柱子 for x_idx, x in enumerate(x_indices): for z_idx, z in enumerate(z_indices): # 计算当前柱子的位置:给同Data下的不同V柱子添加X轴偏移 x_pos = x + z_idx * bar_width z_pos = z y_pos = 0 # Y轴起始位置从0开始 bar_height = value_matrix[x_idx, z_idx] # 绘制3D柱子 ax.bar3d(x_pos, y_pos, z_pos, bar_width, bar_height, bar_depth, color=colors[z_idx], alpha=0.8) # 5. 设置坐标轴与图例 # X轴刻度:让刻度标签显示在分组柱子的中间位置 ax.set_xticks(x_indices + bar_width * (len(z_categories)-1)/2) ax.set_xticklabels(x_categories) # Z轴刻度 ax.set_zticks(z_indices) ax.set_zticklabels(z_categories) # 坐标轴标签 ax.set_xlabel('Data类别') ax.set_zlabel('V类别') ax.set_ylabel('数值') # 添加图例(3D柱状图无法自动生成图例,手动用Patch创建) legend_patches = [Patch(facecolor=colors[i], label=z_categories[i]) for i in range(len(z_categories))] ax.legend(handles=legend_patches, loc='upper right') # 6. 调整视角,匹配Excel图表的角度 ax.view_init(elev=20, azim=-50) plt.tight_layout() plt.show()
关键细节说明
- 柱子分组:通过给同Data类别的不同V柱子添加
z_idx * bar_width的X轴偏移,实现分组效果,避免柱子重叠 - 视角调整:
view_init的elev(仰角)和azim(方位角)参数可以根据你的Excel图表微调,直到视觉效果匹配 - 数据替换:把
value_matrix替换成你实际的数值即可,确保行对应Data1/Data2/Data3,列对应V1/V2/V3
内容的提问来源于stack exchange,提问作者user21979012
相关产品推荐
相关产品推荐

