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

时间:2017-11-28 18:34:03

标签: python matplotlib text width axis

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

  1. 获取文本坐标的宽度除以2。
  2. 从x轴上的中心(提供)位置减去该值。
  3. 使用结果值作为x起始位置(ha ='left')。
  4. 我已经看过如何在绘制如下字符串后获取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
    

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

    我已尝试过以下操作,但它没有返回正确的轴坐标,我认为可能需要进行转换:

    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帖子的后续内容。

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

    提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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()