对齐水平堆积条形图中的值标签 (Matplotlib)

wes*_*ter 3 python matplotlib

使用以下代码,我在 Matplotlib 的水平堆积条形图中添加了值标签:

import pandas
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

def sumzip(*items):
    return [sum(values) for values in zip(*items)]

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

N = 5
values1 = [130, 120, 170, 164, 155]
values2 = [120, 185, 162, 150, 153]
values3 = [100, 170, 160, 145, 150]

ind = np.arange(N) + .15
width = 0.3

rects1 = plt.barh(ind, values1, width, color='blue') 
rects2 = plt.barh(ind, values2, width, left = sumzip(values1), color='green') 
rects3 = plt.barh(ind, values3, width, left = sumzip(values1, values2), color='red')

extra_space = 0.15
ax.set_yticks(ind+width-extra_space)
ax.set_yticklabels( ('Label1', 'Label2', 'Label3', 'Label4', 'Label5') )
ax.yaxis.set_tick_params(length=0,labelbottom=True)

for i, v in enumerate(values1):
    plt.text(v * 0.45, i + .145, str(v), color='white', fontweight='bold', fontsize=10, 
             ha='center', va='center')

for i, v in enumerate(values2):
    plt.text(v * 1.45, i + .145, str(v), color='white', fontweight='bold', fontsize=10, 
             ha='center', va='center')

for i, v in enumerate(values3):
    plt.text(v * 2.45, i + .145, str(v), color='white', fontweight='bold', fontsize=10, 
             ha='center', va='center')

ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

plt.show()
Run Code Online (Sandbox Code Playgroud)

代码给了我以下结果: 在此处输入图片说明

如您所见,绿色和红色部分的标签没有正确对齐。我需要做什么来纠正这个问题?

She*_*ore 6

只有当values1values2values3中的数字都相等时,因子 1.45 和 2.45 才会给出所需的结果。

您需要执行以下操作:

对于第二个柱,x = 第一个柱值 + 0.45 * 第二个柱值

对于第三个柱形,x = 第一个柱形值 + 第二个柱形值 + 0.45 * 第三个柱形值


以下是您如何做到这一点。

# Use values1[i] + v * 0.45 as the x-coordinate
for i, v in enumerate(values2):
    plt.text(values1[i] + v * 0.45, i + .145, str(v), color='white', fontweight='bold', fontsize=10, 
             ha='center', va='center')

# Use values1[i] + values2[i] + v * 0.45 as the x-coordinate
for i, v in enumerate(values3):
    plt.text(values1[i] + values2[i] + v * 0.45, i + .145, str(v), color='white', fontweight='bold', fontsize=10, 
             ha='center', va='center')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明