我正在使用matplotlib.pyplot从Dataframe中绘制图形。 在这里,我想显示每个矩形上条形的高度,并且正在使用Text()。为了标准化Y轴,我在Y轴上采用了Logscale。下面是我的代码,出现错误
Image size of 1005x132589 pixels is too large. It must be less than 2^16 in each direction
当我不使用plt.yscale('log')
时,代码工作正常。
根据一些建议,我也重新启动了内核,但仍然遇到此问题。欢迎对此提出任何建议。
我的代码:
`
#收集的数据列出。
list_alarms = df_region.alarmName
#list_east = df_region.EAST
list_west = df_region.WEST
list_north = df_region.NORTH
list_south = df_region.SOUTH
# X-ticks customization
N = len(list_alarms)
xpos = np.arange(N)
# this json file is used to update the style of the plot.
s = json.load(open('style.json'))
rcParams.update(s)
# Graph customize
plt.rcParams['figure.figsize'] = (15,8)
plt.xlabel('AlarmNames at different Regions')
plt.ylabel('Frequency for alarms in MNG-PAN devices')
plt.title('Alarm Generated by MNG-PAN Device at different Regions')
plt.xticks(xpos,list_alarms, rotation = 280)
# bar1 = plt.bar(xpos - 0.3,list_east, width = 0.2, label = 'EAST',
color = '#3154C8')
bar2 = plt.bar(xpos - 0.1, list_west, label = 'WEST', color =
'#FF9633')
bar3 = plt.bar(xpos + 0.1, list_north, label = 'NORTH', color =
'#12B794')
bar4 = plt.bar(xpos + 0.3, list_south, label = 'SOUTH', color =
'#EF6FE3')
plt.yscale('log')
plt.legend()
def autolabel(rects):
for rect in rects:
height = rect.get_height()
if height < 10000:
plt.text(rect.get_x() + rect.get_width()/2., 1.05*height,
'%d'%int(height),
ha = 'center', va = 'bottom', rotation = 90,
fontsize=9)
# # autolabel(bar1)
autolabel(bar2)
autolabel(bar3)
autolabel(bar4)
plt.show()
`
我正在使用Jupyter Notebook,Pandas,Python3。
答案 0 :(得分:3)
您的X轴可能是字符串值,并且plt.text()仅使用标量值在轴上移动。这就是为什么您的范围可能超出图像大小的原因。将x轴转换为标量值。我遇到了同样的问题,我做了同样的事情。
答案 1 :(得分:2)
在自动标签定义的plt.text
行中检查您的位置变量。我遇到了同样的问题,我发现给plt.text
函数的y变量与我的plot数据集的值相比太大。
答案 2 :(得分:1)
您可以调整像素并更新您的update_datalim()
fig = plt.figure(1, figsize=(8, 14), frameon=False, dpi=100)
fig.add_axes([0, 0, 1, 1])
ax = plt.gca()
corners = ((x1, y1), (x2, y2))
ax.update_datalim(corners)
答案 3 :(得分:1)
另一个可能的解释是,您的y轴值之一为零。因此,您可以将自动标签功能编辑为如下所示:
def autolabel(rects):
for rect in rects:
height = rect.get_height()
if (height != 0):
ax.annotate('{}'.format(height),
xy=(rect.get_x() + rect.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
答案 4 :(得分:0)
发生这种情况是因为您的 x 轴包含日期,并且当您添加文本时,您传递的是标量值。
要解决这个问题,您应该使用 matplotlib.mdates.date2num() 转换日期 参考这个答案: Annotate Time Series plot in Matplotlib
答案 5 :(得分:-1)
使用transform=ax.transAxes
关键字参数对我有用:
例如:
plt.text(0.5, 0.5, 'Some text', transform=ax.transAxes)