gpt4 book ai didi

python - 如何调整 matplotlib 中的自动标记功能,使其正确显示负值?

转载 作者:太空狗 更新时间:2023-10-30 02:26:25 26 4
gpt4 key购买 nike

最近几天我一直在研究 Python,发现了很多好的 resources关于标签,但我未能使其正确显示负值。因为 autolabel() 函数采用条形高度,它似乎始终为正值,所以标签在图表中向上显示,当然不会显示为负值。我能否以某种方式获取构成这些条形的值,或者如何将这些标签放在它们所属的位置并将它们显示为负值?

import pandas as pd
import matplotlib.pyplot as plt
from builtins import list
import matplotlib
matplotlib.style.use('ggplot')
import numpy as np

n_groups = 2

# create plot
fig, ax = plt.subplots()
fig.canvas.set_window_title('Mindestlohn Bundesweit')
index = np.arange(n_groups)
bar_width = 0.20
opacity = 0.8

list_reallohn_week_vollzeit = [-8.159698443426123, 11.395025597733763]
list_reallohn_week_teilzeit = [-1.048913873322391, 28.99318154295449]
list_reallohn_week_mini = [-7.552596893170488, 7.959096278017519]


rects1 = plt.bar(index + 0.00, list_reallohn_week_vollzeit, bar_width,
alpha=opacity,
color='b',
label='Vollzeit')
rects2 = plt.bar(index + bar_width, list_reallohn_week_teilzeit, bar_width,
alpha=opacity,
color='g',
label='Teilzeit')
rects3 = plt.bar(index + bar_width * 2,list_reallohn_week_mini, bar_width,
alpha = opacity,
color='c',
label='Mini Job')

label_week_lists = ('2014 vor MdL', '2015 Nicht MdL berechtigt', '2015 mit MdL')

plt.ylabel('EUR')
plt.title('Reallöhne pro Woche')
plt.xticks(index + bar_width, label_week_lists)
plt.legend(bbox_to_anchor=(1, 1),
bbox_transform=plt.gcf().transFigure)

def autolabel(rects, ax):
# Get y-axis height to calculate label position from.
(y_bottom, y_top) = ax.get_ylim()
y_height = y_top - y_bottom

for rect in rects:
height = rect.get_height()
# Fraction of axis height taken up by this rectangle
p_height = (height / y_height)
# If we can fit the label above the column, do that;
# otherwise, put it inside the column.
if p_height > 0.95: # arbitrary; 95% looked good to me.
label_position = height - (y_height * 0.05)
else:
label_position = height + (y_height * 0.01)

ax.text(rect.get_x() + rect.get_width() / 2., label_position,
'%d' % int(height),
ha='center', va='bottom')

autolabel(rects1, ax)
autolabel(rects2, ax)
autolabel(rects3, ax)

plt.show()

enter image description here

最佳答案

mathplotlib 在那个部门没有很好的文档记录。尝试使用 dir() 函数来显示您正在处理的容器上的可用选项。我发现有一个 .get_y() 函数可以在这种情况下返回负数

试试这段代码

import pandas as pd
import matplotlib.pyplot as plt
from builtins import list
import matplotlib
matplotlib.style.use('ggplot')
import numpy as np

n_groups = 2

# create plot
fig, ax = plt.subplots()
fig.canvas.set_window_title('Mindestlohn Bundesweit')

index = np.arange(n_groups)
bar_width = 0.20
opacity = 0.8

list_reallohn_week_vollzeit = [-8.159698443426123, 11.395025597733763]
list_reallohn_week_teilzeit = [-1.048913873322391, 28.99318154295449]
list_reallohn_week_mini = [-7.552596893170488, 7.959096278017519]


rects1 = plt.bar(index + 0.00, list_reallohn_week_vollzeit, bar_width,
alpha=opacity,
color='b',
label='Vollzeit')
rects2 = plt.bar(index + bar_width, list_reallohn_week_teilzeit, bar_width,
alpha=opacity,
color='g',
label='Teilzeit')
rects3 = plt.bar(index + bar_width * 2,list_reallohn_week_mini, bar_width,
alpha = opacity,
color='c',
label='Mini Job')

label_week_lists = ('2015 Nicht MdL berechtigt', '2015 mit MdL')

plt.ylabel('EUR')
plt.title('Reallöhne pro Woche')
plt.xticks(index + bar_width, label_week_lists)
plt.legend(bbox_to_anchor=(1, 1),
bbox_transform=plt.gcf().transFigure)

def autolabel(rects, ax):
# Get y-axis height to calculate label position from.
(y_bottom, y_top) = ax.get_ylim()
y_height = y_top - y_bottom

for rect in rects:
# print(dir(rect))

height = 0
if rect.get_y() < 0:
height = rect.get_y()
else:
height = rect.get_height()

print(rect.get_height())
print( str(rect.get_y()) )

# Fraction of axis height taken up by this rectangle
p_height = (height / y_height)
# If we can fit the label above the column, do that;
# otherwise, put it inside the column.
if p_height > 0.95: # arbitrary; 95% looked good to me.
label_position = height - (y_height * 0.05)
else:
label_position = height + (y_height * 0.01)

ax.text(rect.get_x() + rect.get_width() / 2., label_position,
'%d' % int(height),
ha='center', va='bottom')

autolabel(rects1, ax)
autolabel(rects2, ax)
autolabel(rects3, ax)

plt.show()

关于python - 如何调整 matplotlib 中的自动标记功能,使其正确显示负值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com