Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅在matplotlib上删除底部错误上限_Python_Python 3.x_Matplotlib - Fatal编程技术网

Python 仅在matplotlib上删除底部错误上限

Python 仅在matplotlib上删除底部错误上限,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我只想显示一半的误差条,因为它们是对称的;因为我不知道如何用“干净的方式”来实现这一点,所以我选择使用底部为0的不对称错误;但后来,当我展示帽子时,我意识到这不是最好的方法 代码如下: import numpy as np import matplotlib.pyplot as plt N = 5 men_means = (20, 35, 30, 35, 27) men_std = (2, 3, 4, 1, 2) ind = np.arange(N) width

我只想显示一半的误差条,因为它们是对称的;因为我不知道如何用“干净的方式”来实现这一点,所以我选择使用底部为0的不对称错误;但后来,当我展示帽子时,我意识到这不是最好的方法

代码如下:

  import numpy as np
  import matplotlib.pyplot as plt

  N = 5
  men_means = (20, 35, 30, 35, 27)
  men_std = (2, 3, 4, 1, 2)

  ind = np.arange(N)
  width = 0.35

  fig, ax = plt.subplots()
  rects1 = ax.bar(ind, men_means, width, color='r',yerr=[np.zeros(len(men_std)),men_std],capsize = 5)

  women_means = (25, 32, 34, 20, 25)
  women_std = (3, 5, 2, 3, 3)
  rects2 = ax.bar(ind + width, women_means, width, color='y',yerr=[np.zeros(len(women_std)),women_std],capsize = 5)

  plt.show()
这是我得到的情节:。正如您所看到的,我绘制半误差条的方法可能不是应该做的

那么,有没有办法隐藏底盖线或更好的方法来绘制半误差条?

可以选择设置
uplims=True
lolims=True
,分别表示平均值重复了上限或下限。不幸的是,您似乎无法将这些选项直接用于
ax.bar
,因此我们必须分别绘制errorbar和bar图

ax.errorbar
中的
uplims/lolims
选项文档:

lolims
/
uplims
/
xlolims
/
xuplims
:bool,可选,默认值:无

这些参数可用于指示值仅给出上限/下限。在这种情况下,使用插入符号来表示这一点。lims参数的类型可能与
xerr
yerr
相同。要使用轴反转的限制,必须在errorbar()之前调用
set_xlim()
set_ylim()

请注意,使用此选项会将大写更改为箭头。如果您需要平盖而不是箭头,请参见下面的示例,了解如何将它们改回大写

您可以在中看到这些选项的作用

现在,这是您的示例,已修改:

import numpy as np
import matplotlib.pyplot as plt

N = 5
men_means = (20, 35, 30, 35, 27)
men_std = (2, 3, 4, 1, 2)

ind = np.arange(N)
width = 0.35

fig, ax = plt.subplots()
rects1 = ax.bar(ind, men_means, width, color='r')
err1 = ax.errorbar(ind, men_means, yerr=men_std, lolims=True, capsize = 0, ls='None', color='k')

women_means = (25, 32, 34, 20, 25)
women_std = (3, 5, 2, 3, 3)
rects2 = ax.bar(ind + width, women_means, width, color='y')
err2 = ax.errorbar(ind + width, women_means, yerr=women_std, lolims=True, capsize = 0, ls='None', color='k')

plt.show()

如果您不喜欢箭头,可以通过更改从
ax.errorbar
返回的
caplines
的标记(作为第二项),将其更改为平头。我们可以将它们从箭头更改为标记样式
,然后使用
控制它们的大小。设置\u markersize

import numpy as np
import matplotlib.pyplot as plt

N = 5
men_means = (20, 35, 30, 35, 27)
men_std = (2, 3, 4, 1, 2)

ind = np.arange(N)
width = 0.35

fig, ax = plt.subplots()
rects1 = ax.bar(ind, men_means, width, color='r')
plotline1, caplines1, barlinecols1 = ax.errorbar(
        ind, men_means, yerr=men_std, lolims=True,
        capsize = 0, ls='None', color='k')

caplines1[0].set_marker('_')
caplines1[0].set_markersize(20)

women_means = (25, 32, 34, 20, 25)
women_std = (3, 5, 2, 3, 3)
rects2 = ax.bar(ind + width, women_means, width, color='y')
plotline2, caplines2, barlinecols2 = ax.errorbar(
        ind + width, women_means, yerr=women_std,
        lolims=True, capsize = 0, ls='None', color='k')

caplines2[0].set_marker('_')
caplines2[0].set_markersize(10)

plt.show()
非常感谢, 根据您的回答,以下方法是我的解决方案:

def process_error_bar(ax, x, y, y_err, marker_size):
    """
    hide half error_bar
    :param ax: plt.subplots()
    :param x: x position
    :param y: y position
    :param y_err: y errors
    :param marker_size: size
    """

    lolims = []
    uplims = []
    for y_value in y:
        if y_value < 0:
            lolims.append(False)
            uplims.append(True)
        else:
            lolims.append(True)
            uplims.append(False)

    plotline, caplines, barlinecols = ax.errorbar(
        x, y, yerr=y_err, lolims=lolims, uplims=uplims,
        capsize=0, ls='None', color='k')

    # [arrow] -> [-]
    for capline in caplines:
        capline.set_marker('_')
        capline.set_markersize(marker_size)
def进程错误条(ax、x、y、y错误、标记大小):
"""
隐藏半错误\u条
:param ax:plt.子批()
:参数x:x位置
:参数y:y位置
:param y_err:y错误
:参数标记大小:大小
"""
lolims=[]
向上=[]
对于y_值(y):
如果y_值<0:
lolims.append(False)
uplms.append(True)
其他:
lolims.append(True)
uplms.append(False)
绘图线、帽线、barlinecols=ax.errorbar(
x、 y,yerr=y_err,lolims=lolims,uplims=uplims,
倾覆=0,ls='None',color='k')
#[箭头]->[-]
对于capline中的capline:
盖线。设置标记(“”)
capline.set_markersize(标记大小)

您提到您不知道是否有一种简单的方法可以避免将大写字母改为箭头。那么这是否意味着有一种方法,尽管不是一种简单的方法?实际上,只要看看它,它并不太难。查看我的编辑