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

如何绘制不对称误差棒且不触发NumPy广播错误?

解决seaborn/matplotlib不对称误差棒的ValueError问题

错误原因分析

  1. 误差计算逻辑错误:你当前的err计算用hpd减去中位数的扩展数组,得到的是置信区间边界与中位数的差值(存在负数),取绝对值后数值不符合误差棒的实际需求,虽形状为(2,3)但逻辑完全错误。
  2. 数组维度冲突:truth[:,np.newaxis]和median都是(3,1)的二维数组,与yerr=(2,3)组合时,matplotlib的广播机制触发维度不匹配报错。
  3. 子图关联缺失:函数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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56