在过去的几天里,我一直在玩Python,并且发现了很多关于标签的好资源,但是我没有正确显示负值.由于该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()
Run Code Online (Sandbox Code Playgroud)
mathplotlib 在该部门没有很好的记录。尝试使用该dir()函数来显示您正在处理的容器上的可用选项。我发现有一个.get_y()函数可以在这种情况下返回负数
试试这个代码
\n\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom builtins import list\nimport matplotlib\nmatplotlib.style.use('ggplot')\nimport numpy as np\n\nn_groups = 2\n\n# create plot\nfig, ax = plt.subplots()\nfig.canvas.set_window_title('Mindestlohn Bundesweit')\n\nindex = np.arange(n_groups)\nbar_width = 0.20\nopacity = 0.8\n\nlist_reallohn_week_vollzeit = [-8.159698443426123, 11.395025597733763]\nlist_reallohn_week_teilzeit = [-1.048913873322391, 28.99318154295449]\nlist_reallohn_week_mini = [-7.552596893170488, 7.959096278017519]\n\n\nrects1 = plt.bar(index + 0.00, list_reallohn_week_vollzeit, bar_width,\n alpha=opacity,\n color='b',\n label='Vollzeit')\nrects2 = plt.bar(index + bar_width, list_reallohn_week_teilzeit, bar_width,\n alpha=opacity,\n color='g',\n label='Teilzeit')\nrects3 = plt.bar(index + bar_width * 2,list_reallohn_week_mini, bar_width,\n alpha = opacity,\n color='c',\n label='Mini Job')\n\nlabel_week_lists = ('2015 Nicht MdL berechtigt', '2015 mit MdL')\n\nplt.ylabel('EUR')\nplt.title('Reall\xc3\xb6hne pro Woche')\nplt.xticks(index + bar_width, label_week_lists)\nplt.legend(bbox_to_anchor=(1, 1),\n bbox_transform=plt.gcf().transFigure)\n\ndef autolabel(rects, ax):\n # Get y-axis height to calculate label position from.\n (y_bottom, y_top) = ax.get_ylim()\n y_height = y_top - y_bottom\n\n for rect in rects:\n # print(dir(rect))\n\n height = 0\n if rect.get_y() < 0:\n height = rect.get_y()\n else:\n height = rect.get_height()\n\n print(rect.get_height())\n print( str(rect.get_y()) )\n\n # Fraction of axis height taken up by this rectangle\n p_height = (height / y_height)\n # If we can fit the label above the column, do that;\n # otherwise, put it inside the column.\n if p_height > 0.95: # arbitrary; 95% looked good to me.\n label_position = height - (y_height * 0.05)\n else:\n label_position = height + (y_height * 0.01)\n\n ax.text(rect.get_x() + rect.get_width() / 2., label_position,\n '%d' % int(height),\n ha='center', va='bottom')\n\nautolabel(rects1, ax)\nautolabel(rects2, ax)\nautolabel(rects3, ax)\n\nplt.show()\nRun Code Online (Sandbox Code Playgroud)\n