Как получить высоту обернутого текста в Matplotlib? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть объект suptitle, который иногда будет переноситься, используя встроенную функциональность переноса Matplotlib.Однако, пытаясь получить высоту субтитра, я всегда получаю высоту, соответствующую одной строке.Куда я иду не так?Вот что я пытаюсь сделать:

from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas

fig = Figure((4, 4))
FigureCanvas(fig)

text_1 = "I'm a short text"
text_2 = "I'm a longer text that will be wrapped autoamtically by Matplotlib, using wrap=True"

title = fig.suptitle(text_1, wrap=True)
fig.canvas.draw()  # Draw text to find out how big it is
bbox = title.get_window_extent()
print(bbox.width)  # 105
print(bbox.height)  # 14

title = fig.suptitle(text_2, wrap=True)
fig.canvas.draw()  # Draw text to find out how big it is
bbox = title.get_window_extent()
print(bbox.width)  # 585 <-- This looks about right
print(bbox.height)  # Still 14 even though this time the text is wrapped!

То же самое происходит с Text объектами (используя что-то вроде fig.text(0.5, 0.5, text_1, wrap=True).

1 Ответ

0 голосов
/ 07 июня 2018

Спасибо @ ImportanceOfBeingErnest за то, что указали, что это на самом деле невозможно.Вот один из обходных путей, такого рода работы, путем проверки количества строк, на которые разбит текст, и умножения на приблизительную высоту строки.Это работает, когда автоматически вставленные разрывы смешиваются вручную (т. Е. В тексте есть "\n"), но будет отключено на количество пикселей.Любые более точные предложения приветствуются.

def get_text_height(fig, obj):
    """ Get the approximate height of a text object.
    """
    fig.canvas.draw()  # Draw text to find out how big it is
    t = obj.get_text()
    r = fig.canvas.renderer
    w, h, d = r.get_text_width_height_descent(t, obj._fontproperties,
                                              ismath=obj.is_math_text(t))
    num_lines = len(obj._get_wrapped_text().split("\n"))
    return (h * num_lines)

text = "I'm a long text that will be wrapped automatically by Matplotlib, using wrap=True"
obj = fig.suptitle(text, wrap=True)
height = get_text_height(fig, obj)
print(height)  # 28 <-- Close enough! (In reality 30)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...