Я пытаюсь создать вложенную древовидную карту в Bokeh.Я могу создать прямоугольники с правильными размерами и вложенными элементами и нанести их на график, но не могу их пометить.Когда я использую LabelSet и добавляю макет, метки размещаются правильно, но если они слишком длинные, они выходят за границы полей, для которых они предназначены.Я хотел бы контролировать текст в полях так, чтобы:
Если ярлык слишком длинный, оберните его.Если этикетка будет соответствовать повернутой, поверните ее.Оберните при необходимости.Если ярлык не подходит в любом случае, уменьшите его.Если он действительно, действительно не подходит, обрежьте его многоточием.
Оборачивание / ориентация / размер этикетки необходимо будет изменить по мере увеличения и уменьшения масштаба на рисунке.Я мог бы справиться с этим, если бы знал, каковы правильные параметры для изменения, но я не могу понять это.Я не знаю, как связать метку с квадом, который должен содержать ее, а не с общей цифрой.
Вот код, воспроизводящий проблему, с которой я столкнулся.Я пропустил разделы, которые должны были создать древовидную карту, и просто сделал пару прямоугольников вручную, чтобы все было просто.Заранее спасибо за помощь.
from bokeh.plotting import figure, output_file, show
from bokeh.models import ColumnDataSource, LabelSet
from bokeh.palettes import Spectral4
output_file('word_wrap.html')
f = figure()
left = [0, 0.5, 0.5, 0.5]
right = [0.5, 1, 1, 1]
top = [1, 1/3, 2/3, 1]
bottom = [0, 0, 1/3, 2/3]
labels = ['fits', 'still fits', 'why is that necessary?',
'the sparrow warbles at midnight under the pale moonlight of a tuscan sun']
label_x = [0.25, 0.75, 0.75, 0.75]
label_y = [1, 1/3, 2/3, 1]
source = ColumnDataSource(dict(left=left, right=right, top=top, bottom=bottom,
line_colors=['black'] * len(left),
colors=Spectral4, labels=labels,
label_x=label_x, label_y=label_y))
f.quad('left', 'right', 'top', 'bottom', source=source,
line_color='line_colors', fill_color='colors')
labels = LabelSet(x='label_x', y='label_y', text='labels', source=source,
text_align='center', text_baseline='top', y_offset=-1)
f.add_layout(labels)
f.axis.visible = False
f.grid.visible = False
show(f)