注释条时无法更改宽度

时间:2019-02-19 07:36:23

标签: python matplotlib data-visualization typeerror

我正在使用以下代码创建一个包含3个细分的堆叠式水平条形图:

import matplotlib.pyplot as plt
import numpy as np

def create_stacked_hbar(data):

    fig, ax = plt.subplots(figsize=(10, 10))

    ylabels = list(data.keys())
    labels = ['a', 'b', 'c', 'd', 'e', 'f']

    c = []
    v = []           
    for key, val in data.items():
        c.append(key)
        v.append(val)
    v = np.array(v)
    print(v)

    plt.barh(range(len(c)), v[:,0], width=1, color='red', 
             edgecolor='w',linewidth=2, tick_label=ylabels, label=labels[0])
    plt.barh(range(len(c)), v[:,1], width=1, left=v[:,0], color='orange', 
             edgecolor='w', linewidth=2, label=labels[1])
    plt.barh(range(len(c)), v[:,2], width=1, left=(v[:,0]+v[:,1]), color='yellow', 
             edgecolor='w', linewidth=2, label=labels[2])

    for p in ax.patches:
            left, bottom, width, height = p.get_bbox().bounds
            if width != 0.0:
                ax.annotate(str(int(width)), xy=(left+width/2, bottom+height/2), 
                            ha='center', va='center', size = 12)

    plt.legend(bbox_to_anchor=(0, -0.15), loc=3, prop={'size': 14}, frameon=False)
    plt.yticks(np.arange(len(ylabels)), ylabels)
    plt.show()

data = {'A': [8, 7, 2], 'B': [0, 2, 0], 
                 'C': [3, 2, 4], 'D': [0, 4, 0], 
                 'E': [0, 1, 1], 'F': [0, 1, 0], 
                 'G': [0, 0, 0]}

create_stacked_hbar(data)

问题在于,尝试在栏中设置width = 1时会引发类型错误:

TypeError: <lambda>() got multiple values for argument 'width'

删除宽度允许代码正常工作,但是我确实需要增加图表中条形的宽度。我怀疑这与我在这种情况下使用的注释代码有关。有人对此有任何建议吗?

还请注意,我无法通过熊猫使用"dataframe.plot.barh(data, stacked=True)"方法来生成此图表。

1 个答案:

答案 0 :(得分:1)

您正在制作水平条形图,width参数对应于数据,因此在您的示例中,您同时将v[:,0]1传递为width。如果由于不想在小节之间设置空格而试图指定高度,请考虑以下示例:

height=1

这会给你

删除import numpy as np import matplotlib.pyplot as plt # Seeded for reproducing np.random.seed(1) v1 = abs(np.random.randn(10)) v2 = abs(np.random.randn(10)) v3 = abs(np.random.randn(10)) c = range(10) plt.title("Sample bar plot") plt.barh(c, v1, height=1, alpha=0.8, color='r') plt.barh(c, v2, height=1, left=v1, alpha=0.8, color='b') plt.barh(c, v3, height=1, left=v1+v2, alpha=0.8, color='g') plt.show() 规范会给您