这是我在网站上的第一个问题,请告诉我它是否应该更详细或者提出不同的要求。
我正在使用python 2.7和matplotlib 2.0.0
基本上我正在做一个matplotib条形图,我想在上面或栏中有y值。这是一个反复出现的问题,并且使用之前的所有答案,我已经能够编写一个“自动标记”。效果很好的功能。但是有一个问题我无法解决。此图表是自动生成的大型报表的一部分,时间范围可能会发生变化。所以它可能是一个星期,一个月或一年。所以我可以只有几百个酒吧。 当我将无花果保存为png时,为了能够放大阅读我需要的所有内容,我使用了15 * 15和dpi = 1200的无花果大小。
所以我的问题是,根据条形数量,条形的宽度会发生变化,字体大小也会发生变化。我设法让它在22天内工作得很漂亮,但是当我更改日期时它不适应,即使我的字体大小是天数(因此是条数)的函数。我将给出用于绘制条形图的代码和自动标记函数。该项目很大,我不能把整个代码,所以如果你需要更多的信息,请告诉我。我只为一个矩形调整自动标签功能,但最终我会在它工作后为所有人做。
fig2, (ax21, ax22) =plt.subplots(2, sharex=True)
fig2.set_size_inches(15, 15)
ind2=ind.tolist()
### Stuffs with the first subplots###
width=0.1
rects21=ax22.bar(ind-3*width, TotDelta, color='#620DB7', width=width, align='center', label='Actual Delta')
check.autolabel(rects21, ax22, width) ### THE AUTOLABEL FUNCTION
rects22=ax22.bar(ind-2*width, delta, color='r',width=width, align='center', label='Model Delta')
rects23=ax22.bar(ind-width, DeltaExp, color='c', width=width, align='center', label='Delta Explained')
rects24=ax22.bar(ind, fees, color='b', width=width, align='center', label='Fees')
rects25=ax22.bar(ind+width, slip, color='#F0F304', width=width, align='center', label='Slippage')
rects26=ax3.bar(ind+2*width, other, color='g', width=width, align='center', label='Other Unamtched')
rects27=ax3.bar(ind+3*width, unexp, color='#692C2C', width=width, align='center', label='Unexplained Delta')
ax22.axhline(linewidth=1, color='k')
ax22.xaxis.set_major_formatter(ticker.FuncFormatter(check.date_format))
ax22.grid()
fontP = FontProperties()
fontP.set_size('small')
ax22.legend(loc='center left', prop=fontP, bbox_to_anchor=(1, 0.5))
plt.xticks(rotation=45)
fig2.tight_layout()
fig2.subplots_adjust(top=0.95, right=0.85)
fig2.suptitle('All Trades')
fig2.savefig("/Users/davidabitbol/Documents/all_dollar.png", dpi=1200)
自动标签功能:
def autolabel(rects, ax, width):
#To be used with a 15*15 fig size and 1200 dpi png
(y_bottom, y_top) = ax.get_ylim()
y_height = y_top - y_bottom
for rect in rects:
height = rect.get_height()
y=rect.get_y()
height
if height != 0:
if y>=0: # Positive value, we use the height of the bar, y value = 0 for some reasons
p_height=height/y_top
if p_height > 0.8: #If more thna 0.8 then we write the text in the bar, as there is not enough place above or below it.
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,
'%.3f' % height,
ha='center', va='bottom', size=(22*width)/(10*len(rects)))
else: # if negative we use the y value since the heing is positivie
p_height=y/y_bottom
if p_height > 0.8:
label_position = y + (y_height * 0.05)
else:
label_position = y - (y_height * 0.01)
ax.text(rect.get_x() + rect.get_width()/2., label_position,
'%.3f' % y,
ha='center', va='bottom', size=(22*width)/(10*len(rects)))