Matplotlib SVG Tooltip

Beginner

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 и просто переключали ее видимость при наведении курсора на фигуру. Также мы добавили интерактивность к графику, создав подсказку, которая будет включаться и выключаться при наведении курсора на фигуры.