Посмотрите мой отчёт по питанию за предыдущий месяц. Видите там круговую диаграмму? Сейчас мы сделаем точно такую же с помощью Python и Matplotlib.
Исходные данные:
Овощи, фрукты, ягоды | 21,79 |
Молочные | 20,18 |
Мясные | 18,82 |
Орешки | 13,64 |
Рыба и морепродукты | 10,30 |
Хлебобулочные | 5,18 |
Чай, кофе, какао-порошки | 4,69 |
Крупы | 3,06 |
Приправы | 1,98 |
Напитки | 0,35 |
Введём эти данные в Python (в качестве IDE я использовал Spyder 3):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import matplotlib.pyplot as plt labels = ['Овощи, фрукты, ягоды', 'Молочные', 'Мясные', 'Орешки', 'Рыба и морепродукты', 'Хлебобулочные', 'Чай, кофе, какао-порошки', 'Крупы', 'Приправы', 'Напитки'] values = [21.79, 20.18, 18.82, 13.64, 10.30, 5.18, 4.69, 3.06, 1.98, 0.35] |
Теперь построим круговую диаграмму:
1 2 3 |
fig1, ax1 = plt.subplots() ax1.pie(sizes, labels=labels) plt.show() |
Функция subplots() возвращает объект Figure и объект Axes. Объект Figure — это базовый объект для всех графиков. Нам он пока не особо нужен. Объект Axes — это объект, который содержит все прямоугольники, линии и т. д. С помощью Axes мы и будем рисовать круговую диаграмму. Вызов ax1.pie — это и есть построение нашей круговой диаграммы.
Результат получился таким:

Как видим, результат получился не очень. Вместо круга получился эллипс. Это можно легко исправить добавив ax1.axis('equal'), который укажет, что соотношение длины и ширины диаграммы должны быть одинаковы:
1 2 3 4 |
fig1, ax1 = plt.subplots() ax1.pie(sizes, labels=labels) ax1.axis('equal') plt.show() |
Хотелось бы ещё видеть легенду. Казалось бы, достаточно вызвать ax1.legend(), но так легенда получается поверх всей диаграммы, что выглядит совсем некрасиво.
Код:
1 2 3 4 5 |
fig1, ax1 = plt.subplots() ax1.pie(sizes, labels=labels) ax1.axis('equal') ax1.legend(loc='best'); plt.show() |
Результат:

Что делать? У функции legend есть параметры. Мы укажем параметр loc и параметр bbox_anchor:
1 |
ax1.legend(loc='upper left', bbox_to_anchor=(1.0, 1.0)) |
Здесь мы указали, что верхний (upper) левый (left) угол легенды будет располагаться сразу за окончанием по ширине (первый параметр bbox_to_anchor) и в самом верху (второй параметр bbox_to_anchor) нашей диаграммы. Результат:

Вообще, с легендой даже хуже что-то стало. Просто дублирование информации получилось. Но можно улучшить текущую круговую диаграмму, если добавить числа в сами части круга. Это делается с помощью параметра autopct метода pie, куда передаётся строка форматирования чисел:
1 2 3 4 5 6 |
fig1, ax1 = plt.subplots() wedges, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.2f%%') ax1.axis('equal') ax1.legend(loc='upper left', bbox_to_anchor=(1.0, 1.0)) plt.show() |
Результат:

Думаю, пока достаточно. Имейте в виду, что в этом примере мы использовали уже приведённые к проценту значения. Можно было давать исходные значения, например, в рублях.
Рекомендую прочитать предыдущую статью про построение графиков с помощью Matplotlib.
В первоначальном коде ‘ax1.pie(sizes, labels=labels)’ ‘sizes’ необходимо заменить на ‘values’ (по названию источника), либо изменить название источника данных.