matplotlib 如何创建不对称的错误条而不触发广播错误?

fzsnzjdm  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(103)

我尝试使用seaborn绘制一些非对称误差线。我不明白为什么我得到了ValueError: operands could not be broadcast together with shapes (3,1) (2,3)
下面是我的代码:

import numpy as np
import matplotlib.pyplot as plt

truth = np.array([0.15725964, 0.15611989, 0.15820897])
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(truth, hpd, median):        
        err = np.absolute(np.transpose(hpd - median@np.ones((1,2))))
            
        return ax.errorbar(truth[:,np.newaxis], median, yerr=err)
 
plot_hpd_err(truth, hpd, median)
  • 如果我注解掉yerr = err,代码就可以正常运行。
  • truth[:,np.newaxis]medianerr的形状为(3,1);(3,1)和(2,3)的三种情况。
  • 我将err设置为(2,N)形状,因为axes.errorbar文档要求我这样做
  • 当我转置truth[:, np.newaxis]hpd以匹配err的形状时,它抛出了一个错误。

最后,我希望三个数据点具有各自的非对称误差条,但我目前无法获得一个没有任何错误的ErrorbarContainer对象(是的,图目前是空白的...)

mlnl4t2r

mlnl4t2r1#

truthhpd的大小必须为(N,);它不能为(N,1)。因此,代码应该为

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt

truth = np.array([0.15725964, 0.15611989, 0.15820897])
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(truth, hpd, median):        
        err = np.absolute(np.transpose(hpd - (median[:, np.newaxis])@np.ones((1,2))))
            
        return ax.errorbar(truth, median, yerr=err)
 
plot_hpd_err(truth, hpd, median)

感谢this answer帮我弄明白了这一点。

相关问题