gpt4 book ai didi

python - 调整大小以适应文本的 Matplotlib 轴

转载 作者:行者123 更新时间:2023-11-28 18:50:29 32 4
gpt4 key购买 nike

我一直在尝试使用 matplotlib 生成这样的条形图

1

但是请注意,黑色条上方的数字超出了顶部轴线。我已经尝试使用 ax.relim()ax.autoscale()ax.autoscale_view() 来纠正这个问题,但是没有成功。

我的问题是:有没有一种方法可以干净地获取轴大小以说明 ax.text 显示的文本大小,而无需手动计算文本 + 矩形的高度并适本地手动调整大小?

我正在使用 Python 2.7.3 和 Matplotlib 1.3.x

编辑:

使用从某些渲染器 hack 获得的文本大小信息手动调整窗口大小可以解决此问题。代码如下:

#!/usr/bin/env python

import matplotlib.pyplot as plt

categoryList = ['F', 'L', 'M', 'T', 'W']
categoryColors = {'C': 'y', 'B': 'r', 'F': 'g', 'M': 'b', 'L': 'm', 'T': 'c', 'W': 'k'}
categoryNames = {'C': 'foo1', 'B': 'foo2', 'F': 'foo3', 'M': 'foo4', 'L': 'foo5', 'T': 'foo6', 'W': 'foo7'}
timeList = [60, 165, 60, 10, 570]
fig = plt.figure()
ax = fig.add_subplot(111)
width = 0.35

legendColors = []
legendNames = []
texts = []
for ind in range(len(categoryList)):
category = categoryList[ind]
rects = ax.bar([ind],timeList[ind],width,color=categoryColors[category],align="center")
legendColors.append(rects[0])
legendNames.append(categoryNames[category])

# Add the text for the number on top of the bar
for rect in rects:
texts.append(ax.text(rect.get_x()+rect.get_width()/2,1.05*rect.get_height(),'%d' % timeList[ind],
ha='center',va='bottom'))
# The x axis indices
ind = range(0,len(categoryList))

ax.set_ylabel("Time (Minutes)")
ax.set_xlabel("Category")
ax.set_xticks(ind)
ax.set_xticklabels(categoryList)
lgd = ax.legend(legendColors,legendNames,bbox_to_anchor=(1.0, 1.0), loc=2, borderaxespad=0.3)

# Epic hacks for getting renderer
fig.savefig('foo.png',bbox_extra_artists=(lgd,),bbox_inches='tight')
renderer = fig.axes[0].get_renderer_cache()

window_bbox_list = [t.get_window_extent(renderer) for t in texts]
data_bbox_list = [window_bbox.transformed(ax.transData.inverted()) for window_bbox in window_bbox_list]
data_coords_list = [data_bbox.extents for data_bbox in data_bbox_list]
height_list = [coordEntry[-1] for coordEntry in data_coords_list]
max_height = max(height_list)
fig.axes[0].set_ylim(top=max_height*1.05)
fig.savefig('foo.png',bbox_extra_artists=(lgd,),bbox_inches='tight')

最佳答案

好吧,我真的不认为有一种干净和自动的方法,因为文本是一个对象,它的生命几乎独立于您绘制它的轴。事实上,在您绘制整个图形之前,它没有实际尺寸...

该方法是跟踪您在图中添加的所有文本,例如:

texts = []
for your_element in your_cycle:
do something
t = ax.text(your_text_params)
texts.append(t)

然后您需要找到文本的最高到达点。为此,您必须提取窗口坐标信息并将它们转换为数据坐标。在此之前,您必须先画出您的图形,否则文本尚未确定(如果有人知道,请指正)。

plt.draw()
window_bbox = [t.get_window_extent() for t in texts]
data_bbox = [ b.transformed(ax.transData.inverted()) for b in window_bbox ]
data_coords = [ b.extents for b in data_bbox ]

得到坐标范围后,我们提取每个框的最大值和它们之间的最大值,然后将边框设置得比那个大一点

max_height = [ e[-1] for e in data_coords ]
top = max(max_height)
ax.set_ylim(ymax=top*1.05)

关于python - 调整大小以适应文本的 Matplotlib 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710259/

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