在matplotlib条形图中修改条形宽度和条形位置(循环容器)

时间:2016-01-06 21:37:50

标签: python pandas matplotlib

我正在尝试调整以下策略(取自here)来调整matplotlib条形图中条形的大小

# Iterate over bars
for container in ax.containers:
    # Each bar has a Rectangle element as child
    for i,child in enumerate(container.get_children()):
        # Reset the lower left point of each bar so that bar is centered
        child.set_y(child.get_y()- 0.125 + 0.5-hs[i]/2)
        # Attribute height to each Recatangle according to country's size
        plt.setp(child, height=hs[i])

但在基于两列DataFrame的绘图上使用它时遇到了奇怪的行为。代码的相关部分几乎相同:

for container in axes.containers:
        for size, child in zip(sizes, container.get_children()):
            child.set_x(child.get_x()- 0.50 + 0.5-size/2)
            plt.setp(child, width=size)

我得到的效果是条形宽度的大小(我在条形图中使用;而不是hbar)按预期更改,但重新居中仅适用于条形图对应于DataFrame的第二列(我已交换它们进行检查),这对应于下图中较浅的蓝色。

enter image description here

我不太清楚这是怎么发生的,因为这两个变化似乎都是作为同一循环的一部分应用的。我也发现很难排除故障,因为在我的情况下,外循环通过两个容器,内循环通过尽可能多的孩子和每个容器(和每个容器的这个)。

我该如何开始排除故障?我怎么能找出我实际上正在循环的东西? (我知道每个孩子都是一个矩形对象,但这还没告诉我两个容器中矩形的区别)

1 个答案:

答案 0 :(得分:1)

显然,在修改垂直条形图时,以下方法效果更好:

for container in axes.containers:
        for i, child in enumerate(container.get_children()):
            child.set_x(df.index[i] - sizes[i]/2)
            plt.setp(child, width=sizes[i])

所以与我正在调整的原始方法的主要区别在于我没有得到容器的当前x_position,而是重新使用DataFrame的索引来设置容器的x_position在索引处减去其一半新的宽度。

enter image description here