上限与上限误差
Upper limit with upper error
是否可以有一个上限(用向下的箭头)以最佳值为中心的点,同时有上限误差?
像这样:
我正在尝试:
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
简短的回答是肯定的,但您必须分别绘制上限和误差线。让我们从正确绘制正常误差线开始。如果您的数据已经在一个 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
相同的大小,这使我可以使用 !=
运算符计算掩码。由于您对除 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')
是否可以有一个上限(用向下的箭头)以最佳值为中心的点,同时有上限误差?
像这样:
我正在尝试:
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
简短的回答是肯定的,但您必须分别绘制上限和误差线。让我们从正确绘制正常误差线开始。如果您的数据已经在一个 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
相同的大小,这使我可以使用 !=
运算符计算掩码。由于您对除 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')