Matplotlib ленточная коробка

Beginner

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

Введение

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

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

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

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

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

Импорт библиотек и загрузка данных

В этом шаге мы импортируем необходимые библиотеки и загружаем данные.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cbook
from matplotlib import colors as mcolors
from matplotlib.image import AxesImage
from matplotlib.transforms import Bbox, BboxTransformTo, TransformedBbox

Создание класса RibbonBox

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

class RibbonBox:
    ## Загрузка изображения ленточки в виде коробки
    original_image = plt.imread(cbook.get_sample_data("Minduka_Present_Blue_Pack.png"))
    cut_location = 70
    b_and_h = original_image[:, :, 2:3]
    color = original_image[:, :, 2:3] - original_image[:, :, 0:1]
    alpha = original_image[:, :, 3:4]
    nx = original_image.shape[1]

    def __init__(self, color):
        rgb = mcolors.to_rgb(color)
        self.im = np.dstack([self.b_and_h - self.color * (1 - np.array(rgb)), self.alpha])

    def get_stretched_image(self, stretch_factor):
        stretch_factor = max(stretch_factor, 1)
        ny, nx, nch = self.im.shape
        ny2 = int(ny*stretch_factor)
        return np.vstack([self.im[:self.cut_location],
                          np.broadcast_to(self.im[self.cut_location], (ny2 - ny, nx, nch)),
                          self.im[self.cut_location:]])

Создание класса RibbonBoxImage

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

class RibbonBoxImage(AxesImage):
    zorder = 1

    def __init__(self, ax, bbox, color, *, extent=(0, 1, 0, 1), **kwargs):
        super().__init__(ax, extent=extent, **kwargs)
        self._bbox = bbox
        self._ribbonbox = RibbonBox(color)
        self.set_transform(BboxTransformTo(bbox))

    def draw(self, renderer, *args, **kwargs):
        stretch_factor = self._bbox.height / self._bbox.width

        ny = int(stretch_factor*self._ribbonbox.nx)
        if self.get_array() is None or self.get_array().shape[0]!= ny:
            arr = self._ribbonbox.get_stretched_image(stretch_factor)
            self.set_array(arr)

        super().draw(renderer, *args, **kwargs)

Создание диаграммы

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

def main():
    fig, ax = plt.subplots()

    years = np.arange(2004, 2009)
    heights = [7900, 8100, 7900, 6900, 2800]
    box_colors = [(0.8, 0.2, 0.2),
                  (0.2, 0.8, 0.2),
                  (0.2, 0.2, 0.8),
                  (0.7, 0.5, 0.8),
                  (0.3, 0.8, 0.7)]

    for year, h, bc in zip(years, heights, box_colors):
        bbox0 = Bbox.from_extents(year - 0.4, 0., year + 0.4, h)
        bbox = TransformedBbox(bbox0, ax.transData)
        ax.add_artist(RibbonBoxImage(ax, bbox, bc, interpolation="bicubic"))
        ax.annotate(str(h), (year, h), va="bottom", ha="center")

    ax.set_xlim(years[0] - 0.5, years[-1] + 0.5)
    ax.set_ylim(0, 10000)

    ## Create a background gradient
    background_gradient = np.zeros((2, 2, 4))
    background_gradient[:, :, :3] = [1, 1, 0]
    background_gradient[:, :, 3] = [[0.1, 0.3], [0.3, 0.5]]
    ax.imshow(background_gradient, interpolation="bicubic", zorder=0.1,
              extent=(0, 1, 0, 1), transform=ax.transAxes, aspect="auto")

    plt.show()

main()

Понимание диаграммы

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

Резюме

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