如何绘制不对称误差棒且不触发NumPy广播错误?
解决seaborn/matplotlib不对称误差棒的ValueError问题
错误原因分析
- 误差计算逻辑错误:你当前的
err计算用hpd减去中位数的扩展数组,得到的是置信区间边界与中位数的差值(存在负数),取绝对值后数值不符合误差棒的实际需求,虽形状为(2,3)但逻辑完全错误。 - 数组维度冲突:
truth[:,np.newaxis]和median都是(3,1)的二维数组,与yerr=(2,3)组合时,matplotlib的广播机制触发维度不匹配报错。 - 子图关联缺失:函数
plot_hpd_err未指定绘图子图,默认使用循环最后一个ax,且未正确关联到创建的子图对象;同时代码未调用plt.show(),导致图表空白。
修正后的代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 补充缺失的seaborn导入 truth = np.array([0.15725964, 0.15611989, 0.15820897]) # hpd为每个median对应的置信区间[下限, 上限] hpd = np.array([[0.00310974, 0.01833195], [0.00546891, 0.017973 ], [0.00687474, 0.01628064]]) median = np.array([[0.15517015],[0.12985473],[0.12510344]]) with sns.plotting_context('notebook', font_scale=1.2): fig, axmatrix = plt.subplots(ncols=2, figsize=(16,8)) for ax in axmatrix.flatten(): ax.set_aspect('equal') def plot_hpd_err(ax, truth, hpd, median): # 将中位数转为一维数组,避免维度冲突 median_flat = median.flatten() # 正确计算上下误差:下误差=中位数-置信区间下限,上误差=置信区间上限-中位数 lower_err = median_flat - hpd[:, 0] upper_err = hpd[:, 1] - median_flat # 组合成(2, N)格式的误差数组,符合errorbar要求 err = np.array([lower_err, upper_err]) # 使用一维数组作为x、y参数,绘制带误差棒的点 return ax.errorbar(truth, median_flat, yerr=err, fmt='o-') # 指定第一个子图绘制,可替换为axmatrix[1]使用第二个子图 plot_hpd_err(axmatrix[0], truth, hpd, median) plt.show() # 显示图表
关键修正点
- 修正误差逻辑:根据置信区间与中位数的关系计算误差长度,确保
err是(2,3)数组,第一行为下误差、第二行为上误差。 - 统一数组维度:将
truth和median转为一维数组,消除二维数组与yerr的广播冲突。 - 明确子图关联:将目标子图作为参数传入函数,确保绘图正确绑定到指定子图;添加
plt.show()显示图表。 - 若你的hpd本身就是误差长度(而非置信区间边界),直接将
err设为np.array([hpd[:,0], hpd[:,1]])即可。
内容的提问来源于stack exchange,提问作者nutrition
相关产品推荐
相关产品推荐

