使用以下代码,我在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()
如您所见,绿色和红色部分中的标签未正确对齐。我需要怎么做才能解决此问题?
答案 0 :(得分:5)
仅当values1
,values2
,values3
中的数字相等时,因数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')
答案 1 :(得分:4)
只需将前面每个列表中的值与相应的索引相加即可,如下所示:
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 * 0.45 + values1[i], i + .145, str(v), color='white', fontweight='bold', fontsize=10,
ha='center', va='center')
for i, v in enumerate(values2):
plt.text(v * 0.45 + values1[i] + values2[i], i + .145, str(v), color='white', fontweight='bold', fontsize=10,
ha='center', va='center')
结果:
答案 2 :(得分:3)