Matplotlib 计算给定字符串的轴坐标范围

Matplotlib Calculate Axis Coordinate Extents Given String

我试图通过以下方式使轴文本对象居中:

  1. 获取文本坐标中的宽度除以 2。
  2. 从 x 轴上的中心(提供的)位置减去该值。
  3. 使用结果值作为x起始位置(ha='left')。

我已经看到了如何在绘制这样的字符串后获取 x 坐标(边界)的示例:

import matplotlib as plt

f = plt.figure()
r = f.canvas.get_renderer()
t = plt.text(0, 0, 'test')
bb = t.get_window_extent(renderer=r)
width = bb.width

但是,我想在 绘图之前知道字符串的宽度(轴坐标),以便我可以预期进行调整。

我尝试了以下方法,但没有 return 正确的轴坐标,我认为可能需要进行转换:

t = matplotlib.textpath.TextPath((0,0), 'test', size=9)
bb = t.get_extents()
w = bb.width   #16.826132812499999

这是一个示例(最后 3 行显示了我想要做的事情):

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
%matplotlib inline
prf=[60,70,65,83,77,70,71]
figsize=3.5,4
fig, ax = plt.subplots(1, 1, figsize = figsize, dpi=300)
ind=np.arange(len(prf))

p=ax.bar(ind,prf,color=colrs,edgecolor='none')
t = matplotlib.textpath.TextPath((0,0), 'test', size=9)
bb = t.get_extents()
w = bb.width
center=len(ind)/2
xposition=center-w/2
ax.text(xposition,110,'test',size=9)

此问题是 this post 的后续问题。

我知道我可以使用 ha='center',但这实际上是针对更复杂的文本(多色),它不提供该选项。

提前致谢!

您可以创建一个文本对象,获取其边界框,然后再次删除文本。您可以将边界框转换为数据坐标(我假设您指的是数据坐标,而不是问题中的轴坐标)并使用它们来创建左对齐文本。

import matplotlib.pyplot as plt

ax = plt.gca()
ax.set_xlim(0,900)
#create centered text 
text = ax.text(400,0.5, "string", ha="center", color="blue")
plt.gcf().canvas.draw()
bb = text.get_window_extent()
# remove centered text
text.remove()
del text
# create left aligned text from position of centered text
bb2 = bb.transformed(ax.transData.inverted())
text = ax.text(bb2.x0,0.5, "string", ha="left", color="red")

plt.show()