如何基于给定联合概率表在MATLAB或Python中绘制3D直方图
报错原因说明
你遇到的X/Y向量长度不一致报错,核心是3D直方图绘图函数需要的输入维度和你传入的一维取值向量不匹配,需要先构造对应维度的网格坐标以及和网格对齐的概率矩阵,两种语言的实现方案如下:
MATLAB实现方案
% 定义X、Y的取值范围 x_val = [3,5,7]; y_val = [0,1,2,3]; % 生成二维网格,保证维度和概率矩阵匹配 [X_grid, Y_grid] = meshgrid(y_val, x_val); % 按公式计算联合概率矩阵,维度为3行4列,和你给出的数值完全对应 P_XY = (X_grid - Y_grid + 1)/54; % 绘制3D直方图 bar3(P_XY, 0.8); % 第二个参数调整柱子宽度,可自行修改 % 配置坐标轴标签 set(gca,'XTickLabel', y_val); set(gca,'YTickLabel', x_val); xlabel('Y取值'); ylabel('X取值'); zlabel('联合概率P_{XY}'); title('联合概率分布3D直方图');
Python实现方案
依赖numpy和matplotlib库,直接运行即可:
import numpy as np import matplotlib.pyplot as plt # 定义X、Y的取值范围 x_val = np.array([3,5,7]) y_val = np.array([0,1,2,3]) # 生成二维网格 X_grid, Y_grid = np.meshgrid(y_val, x_val) # 计算联合概率矩阵 P_XY = (X_grid - Y_grid + 1)/54 # 初始化3D画布 fig = plt.figure(figsize=(8,6)) ax = fig.add_subplot(projection='3d') # 构造bar3d需要的输入参数 dx = dy = 0.8 # 柱子的长宽,可自行调整 x_pos = X_grid.flatten() y_pos = Y_grid.flatten() z_pos = np.zeros_like(x_pos) dz = P_XY.flatten() # 绘制3D柱状图 ax.bar3d(x_pos, y_pos, z_pos, dx, dy, dz) # 配置坐标轴 ax.set_xlabel('Y取值') ax.set_ylabel('X取值') ax.set_zlabel('联合概率$P_{XY}$') ax.set_xticks(y_val) ax.set_yticks(x_val) plt.title('联合概率分布3D直方图') plt.show()
内容的提问来源于stack exchange,提问作者WiseRohin
相关产品推荐
相关产品推荐

