You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python绘制3D柱状图遇形状不匹配错误,求原因及z3、dz用法解析

问题分析与解决

错误原因:形状不匹配

你遇到的ValueError是因为bar3d函数要求输入的x、y、z、dx、dy、dz必须是相同长度的数组(或标量):

  • lst_prob是5个元素,所以原代码里x3、y3、z3、dx、dy都是长度为5的数组
  • 但two_coin_matrix是5×5=25个概率组合,因此z_coin_toss(即dz)是长度为25的数组
    两者长度不匹配,导致广播失败。

z3和dz的用法解释

  • z3:每个3D柱状图的底部z轴坐标,也就是柱子从哪个高度开始向上延伸。你设为np.zeros(...),表示所有柱子都从z=0的平面起始。
  • dz:每个柱子的高度,即z轴方向的长度,对应你计算的似然值乘积放大后的结果。

修正后的代码

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import style
import itertools

def Likelihood(d,p):
    L = 1
    for i in d:
        if i == 1:
            L = L * p
        else: 
            L = L * (1-p)
    return round(L,4)

lst_prob =  [0, 0.25, 0.5, 0.75, 1]
lsts_prob = [lst_prob, lst_prob]
two_coin_matrix = list(itertools.product(*lsts_prob))

quarter_flips = [0,0,1,0,0]
penny_flips = [1,0,1,1,0]

z_coin_toss = []
for probs in two_coin_matrix:
    z_coin_toss.append(round(10000*(Likelihood(quarter_flips, probs[0]) * Likelihood(penny_flips, probs[1]))))

style.use('ggplot')

fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')

# 生成x和y的网格并展平,得到25个点的坐标
x3, y3 = np.meshgrid(lst_prob, lst_prob)
x3 = x3.flatten()
y3 = y3.flatten()

# z3是每个柱子的底部z坐标,长度和x3/y3一致
z3 = np.zeros(len(x3))
# dx和dy是柱子在x、y方向的宽度,调整数值避免重叠
dx = np.full(len(x3), 0.2)
dy = np.full(len(x3), 0.2)
dz = z_coin_toss

ax1.bar3d(x3, y3, z3, dx, dy, dz)

ax1.set_xlabel('25美分硬币正面概率')
ax1.set_ylabel('便士正面概率')
ax1.set_zlabel('似然值×10000')

plt.show()

修正说明

  1. 用np.meshgrid生成x和y的网格,再通过flatten()转换成一维数组,让x3和y3的长度变为25,与dz匹配。
  2. 将dx、dy调整为0.2,避免相邻柱子重叠(原代码用1会导致完全重叠)。
  3. 修改坐标轴标签,更贴合业务含义。

内容的提问来源于stack exchange,提问作者Alan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:41:15