首页 > 解决方案 > 有上限误差的上限

问题描述

是否有可能有一个上限(带有向下箭头),该点以最佳值为中心,同时还有上限错误?

像这样的东西:

在此处输入图像描述

我正在尝试:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([10, 15, 20, 25, 30, 35])
x_el = np.array([1, 1, 2, 25, 1, 2, 1])
x_eu = np.array([1, 1, 2, 1, 1, 2, 1])
y = np.array([29, 15, 9, 10, 25, 14])
y_el = np.array([1, 1, 2, 1, 1, 2, 1])
y_eu = np.array([11,1,2,1,1,2,1])

fig, ax = plt.subplots()

for i in range(len(x)):
    if (x[i] - x_el[i]) == 0:
        el = 0
        ax.errorbar(x[i], y[i], yerr=[[y_el[i]], [y_eu[i]]], xerr=[[el],[x_eu[i]]],
                    c='b', capsize=2, elinewidth=1, marker='o',
                    xuplims=True)
    else:
        ax.errorbar(x[i], y[i], yerr=[[y_el[i]], [y_eu[i]]], xerr=[[x_el[i]], [x_eu[i]]],
                    c='b', capsize=2, elinewidth=1, marker='o')

但这是结果:

在此处输入图像描述

4号点既没有uplim也没有upper error。

标签: pythonmatplotliberrorbar

解决方案


简短的回答是肯定的,但您必须分别绘制上限和误差线。让我们从正确绘制正常误差线开始。如果您的数据已经在一个 numpy 数组中,您可以在不循环的情况下执行此操作:

import numpy as np
import matplotlib.pyplot as plt

x = np.array([10, 15, 20, 25, 30, 35])
x_el = np.array([1, 1, 2, 25, 1, 2])
x_eu = np.array([1, 1, 2, 1, 1, 2])
y = np.array([29, 15, 9, 10, 25, 14])
y_el = np.array([1, 1, 2, 1, 1, 2])
y_eu = np.array([11, 1, 2, 1, 1, 2])

fig, ax = plt.subplots()

mask = (x != x_el)

ax.errorbar(x, y, yerr=[y_el, y_eu], xerr=[x_el * mask, x_eu],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none')

请注意,我将误差条数组修剪到与 相同的大小x,这允许我使用!=运算符计算掩码。由于您有兴趣拥有除 in 之外的所有误差线x_el,因此我乘以掩码。掩码是一个布尔值,任何被屏蔽的错误栏都将被设置为零。此时,所有其他条都已正确绘制:

在此处输入图像描述

现在您可以使用相同的掩码(但反转)来绘制上限:

ax.errorbar(x[~mask], y[~mask], xerr=x_el[~mask],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=True)

结果是

在此处输入图像描述

如果你对一个延伸到零的超长箭头不感兴趣,你可以将它缩短到你喜欢的任何大小:

ax.errorbar(x[~mask], y[~mask], xerr=1,
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=True)

在此处输入图像描述

选择

您甚至可以通过一个绘图调用非常接近,因为xuplims它接受一个布尔数组。但是,任何为 True 的地方都会消除右栏:

mask = (x == x_el)
ax.errorbar(x, y, yerr=[y_el, y_eu], xerr=[x_el, x_eu],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none',
            xuplims=mask)

在此处输入图像描述

在这种情况下,您最终必须填写正确的栏:

ax.errorbar(x[mask], y[mask], xerr=[np.zeros_like(x_eu)[mask], x_eu[mask]],
            c='b', capsize=2, elinewidth=1, marker='o', linestyle='none')

在此处输入图像描述


推荐阅读