Создать график в форме шляпы

Beginner

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

Введение

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

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

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

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

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

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

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

import matplotlib.pyplot as plt
import numpy as np

Определение функции для графика в форме шляпы

В этом шаге мы определим функцию, которая создает график в форме шляпы. Функция принимает следующие параметры:

  • ax: оси (Axes), в которые будет нарисован график.
  • xlabels: имена категорий, которые будут отображаться по оси x.
  • values: значения данных. Строки - это группы, а столбцы - это категории.
  • group_labels: метки групп, отображаемые в легенде.
def hat_graph(ax, xlabels, values, group_labels):
    """
    Создает график в форме шляпы.

    Параметры
    ----------
    ax : matplotlib.axes.Axes
        оси (Axes), в которые будет нарисован график.
    xlabels : список строк
        имена категорий, которые будут отображаться по оси x.
    values : (M, N) массив подобного типа
        значения данных.
        Строки - это группы (len(group_labels) == M).
        Столбцы - это категории (len(xlabels) == N).
    group_labels : список строк
        метки групп, отображаемые в легенде.
    """

    def label_bars(heights, rects):
        """Прикрепляет текстовую метку сверху каждого столбца."""
        for height, rect in zip(heights, rects):
            ax.annotate(f'{height}',
                        xy=(rect.get_x() + rect.get_width() / 2, height),
                        xytext=(0, 4),  ## 4 точки вертикального смещения.
                        textcoords='offset points',
                        ha='center', va='bottom')

    values = np.asarray(values)
    x = np.arange(values.shape[1])
    ax.set_xticks(x, labels=xlabels)
    spacing = 0.3  ## расстояние между группами в форме шляпы
    width = (1 - spacing) / values.shape[0]
    heights0 = values[0]
    for i, (heights, group_label) in enumerate(zip(values, group_labels)):
        style = {'fill': False} if i == 0 else {'edgecolor': 'black'}
        rects = ax.bar(x - spacing/2 + i * width, heights - heights0,
                       width, bottom=heights0, label=group_label, **style)
        label_bars(heights, rects)

Подготовка данных

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

## initialise labels and a numpy array make sure you have
## N labels of N number of values in the array
xlabels = ['I', 'II', 'III', 'IV', 'V']
playerA = np.array([5, 15, 22, 20, 25])
playerB = np.array([25, 32, 34, 30, 27])

Создание графика в форме шляпы

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

fig, ax = plt.subplots()
hat_graph(ax, xlabels, [playerA, playerB], ['Player A', 'Player B'])

## Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_xlabel('Games')
ax.set_ylabel('Score')
ax.set_ylim(0, 60)
ax.set_title('Scores by number of game and players')
ax.legend()

fig.tight_layout()
plt.show()

Полный код

Вот полный код на Python для создания графика в форме шляпы.

import matplotlib.pyplot as plt
import numpy as np


def hat_graph(ax, xlabels, values, group_labels):
    """
    Создает график в форме шляпы.

    Параметры
    ----------
    ax : matplotlib.axes.Axes
        оси (Axes), в которые будет нарисован график.
    xlabels : список строк
        имена категорий, которые будут отображаться по оси x.
    values : (M, N) массив подобного типа
        значения данных.
        Строки - это группы (len(group_labels) == M).
        Столбцы - это категории (len(xlabels) == N).
    group_labels : список строк
        метки групп, отображаемые в легенде.
    """

    def label_bars(heights, rects):
        """Прикрепляет текстовую метку сверху каждого столбца."""
        for height, rect in zip(heights, rects):
            ax.annotate(f'{height}',
                        xy=(rect.get_x() + rect.get_width() / 2, height),
                        xytext=(0, 4),  ## 4 точки вертикального смещения.
                        textcoords='offset points',
                        ha='center', va='bottom')

    values = np.asarray(values)
    x = np.arange(values.shape[1])
    ax.set_xticks(x, labels=xlabels)
    spacing = 0.3  ## расстояние между группами в форме шляпы
    width = (1 - spacing) / values.shape[0]
    heights0 = values[0]
    for i, (heights, group_label) in enumerate(zip(values, group_labels)):
        style = {'fill': False} if i == 0 else {'edgecolor': 'black'}
        rects = ax.bar(x - spacing/2 + i * width, heights - heights0,
                       width, bottom=heights0, label=group_label, **style)
        label_bars(heights, rects)


## initialise labels and a numpy array make sure you have
## N labels of N number of values in the array
xlabels = ['I', 'II', 'III', 'IV', 'V']
playerA = np.array([5, 15, 22, 20, 25])
playerB = np.array([25, 32, 34, 30, 27])

fig, ax = plt.subplots()
hat_graph(ax, xlabels, [playerA, playerB], ['Player A', 'Player B'])

## Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_xlabel('Games')
ax.set_ylabel('Score')
ax.set_ylim(0, 60)
ax.set_title('Scores by number of game and players')
ax.legend()

fig.tight_layout()
plt.show()

Резюме

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