【问题标题】:How to increase the thickness of error line in a matplotlib bar chart?如何在 matplotlib 条形图中增加误差线的粗细?
【发布时间】:2017-07-25 22:22:49
【问题描述】:

请参考最低工作示例here

条形图如下图所示,但我找不到增加误差线粗细的方法。 elinewidth 选项在ax.bar 中不可用

> rects1 = ax.bar(..., elinewidth=3)

AttributeError: Unknown property elinewidth

以下链接需要使用ax.errorbar()

但是有没有可以直接提供给ax.bar()的选项?

【问题讨论】:

    标签: python matplotlib bar-chart errorbar


    【解决方案1】:

    您可以使用error_kw参数如下:

    error_kw=dict(lw=5, capsize=5, capthick=3)
    

    所以在这个例子中,它会是:

    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)  # the x locations for the groups
    width = 0.35       # the width of the bars
    
    fig, ax = plt.subplots()
    rects1 = ax.bar(ind, men_means, width, color='r', yerr=men_std, error_kw=dict(lw=5, capsize=5, capthick=3))
    
    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=women_std, error_kw=dict(lw=5, capsize=5, capthick=3))
    
    # add some text for labels, title and axes ticks
    ax.set_ylabel('Scores')
    ax.set_title('Scores by group and gender')
    ax.set_xticks(ind + width / 2)
    ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
    
    ax.legend((rects1[0], rects2[0]), ('Men', 'Women'))
    
    
    def autolabel(rects):
        """
        Attach a text label above each bar displaying its height
        """
        for rect in rects:
            height = rect.get_height()
            ax.text(rect.get_x() + rect.get_width() / 2, 
                    1.05 * height,
                    f'{height:.0f}',
                    ha='center', va='bottom')
    
    autolabel(rects1)
    autolabel(rects2)
    
    plt.show()
    

    给你:


    对此的改进是在每个误差线上方显示值。这可以通过首先获取误差条高度来完成,如下所示:

    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)  # the x locations for the groups
    width = 0.35        # the width of the bars
    
    fig, ax = plt.subplots()
    rects1 = ax.bar(ind, men_means, width, color='r', yerr=men_std, error_kw=dict(lw=5, capsize=5, capthick=3))
    
    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=women_std, error_kw=dict(lw=5, capsize=5, capthick=3))
    
    # add some text for labels, title and axes ticks
    ax.set_ylabel('Scores')
    ax.set_title('Scores by group and gender')
    ax.set_xticks(ind + width / 2)
    ax.set_xticklabels(('G1', 'G2', 'G3', 'G4', 'G5'))
    
    ax.set_ylim(0, 45)  # Add space for errorbar height
    ax.legend((rects1[0], rects2[0]), ('Men', 'Women'))
    
    
    def autolabel(rects):
        """
        Attach a text label above each bar displaying its height
        """
    
        data_line, capline, barlinecols = rects.errorbar
    
        for err_segment, rect in zip(barlinecols[0].get_segments(), rects):
            height = err_segment[1][1]  # Use height of error bar
    
            ax.text(rect.get_x() + rect.get_width() / 2, 
                    1.05 * height,
                    f'{height:.0f}',
                    ha='center', va='bottom')
    
    autolabel(rects1)
    autolabel(rects2)
    
    plt.show()
    

    给你:

    注意:需要计算 y 轴限制。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2014-09-03
      相关资源
      最近更新 更多