Matplotlib: пользовательские единицы

PythonPythonBeginner
Практиковаться сейчас

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

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

Введение

Matplotlib - это библиотека для построения графиков для языка программирования Python. Она предоставляет объектно-ориентированный API для встраивания графиков в приложения с использованием общих целевых средств графического интерфейса пользователя, таких как Tkinter, wxPython, Qt или GTK. Matplotlib позволяет разработчикам создавать широкий спектр статических, анимированных и интерактивных визуализаций на Python.

В этом практическом занятии мы научимся создавать пользовательские единицы в Matplotlib и строить графики с использованием этих пользовательских единиц.

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

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

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

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

Импорт библиотек

В первом шаге нам нужно импортировать необходимые библиотеки - matplotlib.pyplot, numpy, matplotlib.ticker и matplotlib.units.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.ticker as ticker
import matplotlib.units as units

Создайте класс пользовательских единиц

В этом шаге мы создадим класс пользовательских единиц - Foo. Этот класс будет поддерживать преобразование и разные форматы делений шкалы в зависимости от "единицы". Здесь "единица" - это просто скалярный коэффициент преобразования.

class Foo:
    def __init__(self, val, unit=1.0):
        self.unit = unit
        self._val = val * unit

    def value(self, unit):
        if unit is None:
            unit = self.unit
        return self._val / unit

Создайте класс конвертера

В этом шаге мы создадим класс конвертера - FooConverter. Этот класс будет определять три статических метода - axisinfo, convert и default_units.

class FooConverter(units.ConversionInterface):
    @staticmethod
    def axisinfo(unit, axis):
        """Return the Foo AxisInfo."""
        if unit == 1.0 or unit == 2.0:
            return units.AxisInfo(
                majloc=ticker.IndexLocator(8, 0),
                majfmt=ticker.FormatStrFormatter("VAL: %s"),
                label='foo',
                )

        else:
            return None

    @staticmethod
    def convert(obj, unit, axis):
        """
        Convert *obj* using *unit*.

        If *obj* is a sequence, return the converted sequence.
        """
        if np.iterable(obj):
            return [o.value(unit) for o in obj]
        else:
            return obj.value(unit)

    @staticmethod
    def default_units(x, axis):
        """Return the default unit for *x* or None."""
        if np.iterable(x):
            for thisx in x:
                return thisx.unit
        else:
            return x.unit

Зарегистрируйте класс пользовательских единиц

В этом шаге мы зарегистрируем класс пользовательских единиц - Foo - с классом конвертера - FooConverter.

units.registry[Foo] = FooConverter()

Создайте точки данных

В этом шаге мы создадим несколько точек данных с использованием класса пользовательских единиц - Foo.

## create some Foos
x = [Foo(val, 1.0) for val in range(0, 50, 2)]
## and some arbitrary y data
y = [i for i in range(len(x))]

Создайте графики

В этом шаге мы создадим два графика - один с использованием пользовательских единиц, а другой с использованием стандартных единиц.

fig, (ax1, ax2) = plt.subplots(1, 2)
fig.suptitle("Custom units")
fig.subplots_adjust(bottom=0.2)

## plot specifying units
ax2.plot(x, y, 'o', xunits=2.0)
ax2.set_title("xunits = 2.0")
plt.setp(ax2.get_xticklabels(), rotation=30, ha='right')

## plot without specifying units; will use the None branch for axisinfo
ax1.plot(x, y)  ## uses default units
ax1.set_title('default units')
plt.setp(ax1.get_xticklabels(), rotation=30, ha='right')

plt.show()

Запустите код

В последнем шаге запустите код для создания графиков с пользовательскими единицами.

Резюме

В этом практическом занятии мы узнали, как создавать пользовательские единицы в Matplotlib с использованием класса пользовательских единиц и класса конвертера. Затем мы создали два графика - один с использованием пользовательских единиц, а другой с использованием стандартных единиц - для демонстрации использования этих пользовательских единиц. Пользовательские единицы могут быть полезны при работе с сложными данными, требующими пользовательской шкалы или форматирования делений на осях.