Matplotlib SVG Tooltip

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот практикум представляет собой пошаговое руководство по созданию подсказки, которая будет появляться при наведении курсора на элемент matplotlib. Мы создадим подсказку в matplotlib и просто переключим ее видимость при наведении курсора на элемент. Этот подход позволяет полностью контролировать расположение и внешний вид подсказки, но требует написания большего количества кода с самого начала.

Советы по работе с ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Ноутбук, чтобы приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Создаем фигуры

Сначала мы создаем фигуры, к которым будут привязываться подсказки.

rect1 = plt.Rectangle((10, -20), 10, 5, fc='blue')
rect2 = plt.Rectangle((-20, 15), 10, 5, fc='green')

shapes = [rect1, rect2]
labels = ['This is a blue rectangle.', 'This is a green rectangle']

Добавляем фигуры и аннотации для подсказок

Затем мы добавляем фигуры и аннотации для подсказок на график. Аннотации для подсказок создаются с использованием метода annotate. Мы задаем параметр xy координатами фигуры и xytext значением (0, 0), чтобы расположить подсказку непосредственно над фигурой. Также мы задаем параметр textcoords значением 'offset points', чтобы выровнять подсказку с фигурой. Мы задаем параметр color значением 'w', чтобы сделать текст белым, ha значением 'center', чтобы выровнять текст по горизонтали, fontsize значением 8, чтобы установить размер шрифта, и bbox, чтобы задать стиль рамки подсказки.

for i, (item, label) in enumerate(zip(shapes, labels)):
    patch = ax.add_patch(item)
    annotate = ax.annotate(labels[i], xy=item.get_xy(), xytext=(0, 0),
                           textcoords='offset points', color='w', ha='center',
                           fontsize=8, bbox=dict(boxstyle='round, pad=.5',
                                                 fc=(.1,.1,.1,.92),
                                                 ec=(1., 1., 1.), lw=1,
                                                 zorder=1))

    ax.add_patch(patch)
    patch.set_gid(f'mypatch_{i:03d}')
    annotate.set_gid(f'mytooltip_{i:03d}')

Сохраняем график в формате SVG

Мы сохраняем график в фиктивный файловый объект с использованием класса BytesIO и метода savefig.

ax.set_xlim(-30, 30)
ax.set_ylim(-30, 30)
ax.set_aspect('equal')

f = BytesIO()
plt.savefig(f, format="svg")

Добавляем интерактивность

Добавляем интерактивность к графику, создавая подсказку, которая будет включаться и выключаться при наведении курсора на фигуры. Для этого создаем XML-дерево из SVG-файла, скрываем подсказки и назначаем вызовы onmouseover и onmouseout для фигур. Также определяем функции ShowTooltip и HideTooltip, которые будут вызываться при наведении курсора на фигуры.

tree, xmlid = ET.XMLID(f.getvalue())
tree.set('onload', 'init(event)')

for i in shapes:
    ## Получаем индекс фигуры
    index = shapes.index(i)
    ## Скрываем подсказки
    tooltip = xmlid[f'mytooltip_{index:03d}']
    tooltip.set('visibility', 'hidden')
    ## Назначаем вызовы onmouseover и onmouseout для фигур.
    mypatch = xmlid[f'mypatch_{index:03d}']
    mypatch.set('onmouseover', "ShowTooltip(this)")
    mypatch.set('onmouseout', "HideTooltip(this)")

## Это скрипт, определяющий функции ShowTooltip и HideTooltip.
script = """
    <script type="text/ecmascript">
    <![CDATA[

    function init(event) {
        if ( window.svgDocument == null ) {
            svgDocument = event.target.ownerDocument;
            }
        }

    function ShowTooltip(obj) {
        var cur = obj.id.split("_")[1];
        var tip = svgDocument.getElementById('mytooltip_' + cur);
        tip.setAttribute('visibility', "visible")
        }

    function HideTooltip(obj) {
        var cur = obj.id.split("_")[1];
        var tip = svgDocument.getElementById('mytooltip_' + cur);
        tip.setAttribute('visibility', "hidden")
        }

    ]]>
    </script>
    """

## Вставляем скрипт в начало файла и сохраняем его.
tree.insert(0, ET.XML(script))
ET.ElementTree(tree).write('svg_tooltip.svg')

Резюме

В этом практическом занятии мы узнали, как создать подсказку, которая появляется при наведении курсора на фигуру в matplotlib. Мы создали подсказку в matplotlib и просто переключали ее видимость при наведении курсора на фигуру. Также мы добавили интерактивность к графику, создав подсказку, которая будет включаться и выключаться при наведении курсора на фигуры.