Сравните excel, нарисуйте вафельную диаграмму с помощью python

Python

Это 6-й день моего участия в августовском испытании обновлений.Подробности о мероприятии:Испытание августовского обновления

Всем привет, меня зовут Кай.

Вафельная диаграмма или прямоугольная круговая диаграмма может визуально отображать процент завершения. По сравнению с традиционной круговой диаграммой вафельная диаграмма более четко и точно отображает процентное соотношение, а каждая ее ячейка представляет 1%. Типичное применение вафельной диаграммы — сравнение коэффициента завершения индикаторов одного типа. Например, завершение работы, годовой доход и т. д.

1. Excel, чтобы нарисовать вафельную диаграмму

На самом деле существует много способов нарисовать вафельную диаграмму в excel, более сложный — настроить параметры гистограммы после вставки диаграммы гистограммы, другая относительно простая операция — взять单元格格式Это также программа, которую мы собираемся представить сегодня.

1.1 Предварительный просмотр эффекта

excel绘制效果

1.2. Этапы реализации

сначала выберите10*10Всего 100 интервалов ячеек, а затемпиксели ширины и высоты установлены равными, здесь мы устанавливаем значение 25 пикселей

设置单元格高&宽

Тогда мы в клетке изслева -> справа,вниз -> вверхзаполнить цифры1-100

填入数字1-100

Чтобы отобразить значение прогресса, мы вводим значение внизу (здесь в качестве примера используется 66%), а затем выбираем цифровую область 10 * 10 для条件格式Настройки ->图标集—>形状

条件格式设置

Наконец, снова введите параметры условного форматирования и выберите правила управления, чтобы установить подробные правила.Нажмите «Изменить правило».Или дважды щелкните конкретное правило напрямую

编辑规则

Конкретные правила заключаются в следующем:

  • Формула выбора типа
  • Если значение ячейки превышает указанное значение (здесь ячейка C13 66% * 100), оно будет выделено серым цветом.
  • Если значение ячейки не превышает указанного значения, оно будет оранжево-красным
  • При этом не забудьте поставить галочку только на отображение значков (иначе будет случай, когда номера сот будут отображать наложенные значки)

具体规则

После определения правил мы видим, что эффект выглядит следующим образом, и мы закончили с простой оптимизацией (например, удалением сеток и добавлением других элементов).

初步结果预览

2. Python рисует вафельную диаграмму

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

Старые правила, сначала установите, а потом пользуйтесь:

pip install pywaffle

Затем идет простой процесс рисования:

import matplotlib.pyplot as plt
from pywaffle import Waffle
# 设置中文字体
plt.rcParams["font.family"] = "Microsoft YaHei"
# 进度值
value = 0.66
values = [value,1-value]
fig = plt.figure(
    FigureClass=Waffle,
    rows=10, # 10行
    columns=10, # 10列
    values=values, # 值
    colors=["#FF4500", "#C0C0C0"], # 配色
    vertical=True, # 设置绘图方向从下往上、从左往右
    characters='●', # 用实心圆做图标
    font_size=45, # 大小为45
    title={
        'label': '工作完成度', # 设置图表标题
        'loc': 'center',
        'y':1.05,
        'fontdict': {
            'fontsize': 20
    }
},
)
fig.text( # 设置进度值显示
    x=0.3,
    y=-0.03,
    s=f"{int(100*value)}%",
    ha="center",
    va="center",
    fontsize=25,
    color='orangered', # 橙红色
)

Вывод сюжета выглядит следующим образом:

python绘制华夫饼图

3. Введение в вафельную диаграмму pywaffle

Так как функция представляет собой вафельную диаграмму, содержание не сложное, и можно напрямую обратиться к официальной документации (доступны и функции, и кейсы, и они относительно просты).

# 官网地址
https://pywaffle.readthedocs.io/

Вафельная диаграмма,Также известен какSquare Pie Chart, представляет собой вариант круговой диаграммы, хорошо отображающийДоля частей в целом. Вообще говоря, вафельная диаграмма состоит из 100 сеток, и одна сетка представляет1%. Используйте сетки разных цветов, чтобы различать разные категориальные данные, чтобы показать долю каждой части в целом.

3.1 Базовый случай

вводитьmatplotlibиpywaffle, указанный при построении графикаFigureClass=WaffleПросто

import matplotlib.pyplot as plt
from pywaffle import Waffle

plt.figure(
    FigureClass=Waffle,
    rows=5, # 行数
    columns=10,  # 列数
    values=[30, 16, 4] # 值(三类值,这里总和=50和格子总数相等,则行列可以只指定一个即可)
)
plt.show()

параметрvaluesТакже принимает данные в словаре, ключи словаря будут использоваться как метки и отображаться в легенде

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    columns=10,
    values={'Cat1': 30, 'Cat2': 16, 'Cat3': 4},
    legend={ # 图例
        'loc': 'upper left', # 图例位置
        'bbox_to_anchor': (1, 1) # 图例位置坐标
    }
)

3.2 Численное масштабирование

Когда общее количество сеток и сумма чисел в значениях не равны, установите параметрrounding_ruleЗначение может указывать правила масштабирования.

когдаrounding_ruleдаceilили когдаnearest, сумма значений масштабирования может быть больше, чем общее количество ячеек. В этом случае сетка последней категории не будет отображаться полностью. Поэтому, хотяnearestправило округления по умолчанию, ноfloorНа самом деле это наиболее последовательное правило, поскольку оно позволяет избежать переполнения решетки.

В следующем примере значения масштабируются до 24, 23, 1 в качестве номера сетки и используютсяrounding_rule= floor

plt.figure(
    FigureClass=Waffle,
    rows=5,
    columns=10,
    values=[48, 46, 3],
    rounding_rule='floor'
)

Конечно, количество сеток также можно настроить автоматически, установив только одну строку и одно значение параметра:

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[48, 46, 3],
)

3.3 Заголовки, ярлыки и легенды

параметр titletitle, параметр меткиlabels, параметр легендыlegend. Значения этих параметров такие же, как и в matplotlib.Подробности см. в соответствующем введении к matplotlib.

data = {'Cat1': 30, 'Cat2': 16, 'Cat3': 4}
fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    columns=10,
    values=data,
    title={
        'label': 'Example plot',
        'loc': 'left',
        'fontdict': {
            'fontsize': 20
        }
    },
    labels=[f"{k} ({int(v / sum(data.values()) * 100)}%)" for k, v in data.items()],
    legend={
        # 'labels': [f"{k} ({v}%)" for k, v in data.items()],  # lebels could also be under legend instead
        'loc': 'lower left',
        'bbox_to_anchor': (0, -0.2),
        'ncol': len(data),
        'framealpha': 0,
        'fontsize': 12
    }
)

3.4 Цвет шашки

параметрcolorsПринимает цвета в списке или кортеже, которые должны быть той же длины, что иvalues. В то же время мы также можем установить параметрыcmap_nameуказатьColormap.

Укажите цвета цветов

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    columns=10,
    values=[30, 16, 4],
    colors=["#232066", "#983D3D", "#DCB732"]
)

укажите cmap_name

Поддерживаются только качественные цветовые карты, включаяPastel1,Pastel2,Paired,Accent,Dark2,Set1,Set2,Set3,tab10,tab20,tab20b,tab20c.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    columns=10,
    values=[30, 16, 4],
    cmap_name="Accent"
)

3.5 Заполните сетку символами или значками

персонаж

Категории могут иметь разные символы для каждой категории путем передачи списка или кортежа символов в параметрcharacters, длина должна быть такой же, какvalues. Иногда обнаруживается, что шрифт по умолчанию не поддерживается, необходимо указать шрифт, в параметр необходимо передать абсолютный путь файла .ttf или .otffont_file.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    colors=["#4C8CB5", "#B7CBD7", "#C0C0C0"],
    characters='●',
    font_size=24
)

значок

PyWaffle поддерживает использованиеFont Awesome 图标сделать рисунок

fontawesome.com/

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    colors=["#232066", "#983D3D", "#DCB732"],
    icons='star',
    font_size=24
)

Каждая категория может иметь свой значок, передав список или кортеж имен значков в параметрicons, длина должна быть такой же, какvalues.

В Font Awesome Icons есть разные наборы иконок в разных стилях, включая Solid, Regular и Brands. можно указать параметрамиicon_styleможно установить, по умолчанию начинается сsolidзначок поиска в стиле.

использоватьicon_legend= True, символы в легенде будут значками. В противном случае это будет цветовая полоса.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    colors=["#FFA500", "#4384FF", "#C0C0C0"],
    icons=['sun', 'cloud-showers-heavy', 'snowflake'],
    font_size=20,
    icon_style='solid',
    icon_legend=True,
    legend={
        'labels': ['Sun', 'Shower', 'Snow'], 
        'loc': 'upper left', 
        'bbox_to_anchor': (1, 1)
    }
)

Font Awesome Icons находит значки по стилю и имени значка. Различные стили содержат разные наборы значков. Поэтому icon_style не может быть одинаковым для всех иконок. при этих обстоятельствах,icon_styleМожет быть списком или кортежем стилей.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    colors=["#FFA500", "#4384FF", "#C0C0C0"],
    icons=['sun', 'cloud-showers-heavy', 'font-awesome-flag'],
    icon_size=20,
    icon_style=['regular', 'solid', 'brands'],
    icon_legend=False,
    legend={
        'labels': ['Sun', 'Shower', 'Flag'], 
        'loc': 'upper left', 
        'bbox_to_anchor': (1, 1)
    }
)

3.6 Другие свойства сетки

Другие свойства сетки включают форму нарисованной сетки, интервал, начальное положение и направление рисования.

клетчатый цвет

параметрblock_aspect_ratioУправляйте формой сетки, изменяя соотношение ширины и высоты сетки. По умолчанию он равен 1, поэтому сетка квадратная.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    block_aspect_ratio=1.618
)

интервал

параметрinterval_ratio_xиinterval_ratio_yУправляет горизонтальным и вертикальным расстоянием между сетками.interval_ratio_xгоризонтальное расстояние между сетками и ширина сеткиinterval_ratio_y– отношение расстояния между сетками по вертикали к высоте сетки.

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    interval_ratio_x=1,
    interval_ratio_y=0.5
)

отправная точка

Использовать параметрыstarting_locationУстановите положение стартовой сетки. Он принимает позицию в строке, напримерNW, SW,NEиSEпредставляет четыре угла. По умолчанию этоSW, что означает, что PyWaffle начинает рисовать решетку с левого нижнего угла.

Это из правого нижнего угла(SE), чтобы начать рисовать:

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    starting_location='SE'
)

направление рисования

По умолчанию PyWaffle рисует столбец сетки за столбцом, поэтому категории отображаются горизонтально. Чтобы сделать его вертикальным, установите параметрverticalзаTrue.

В приведенном ниже примере он рисует решетку из нижнего левого угла в нижний правый угол до самого верха:

3.7 Прочее

Настройка размера графики, цвета фона, DPI и т. д.

рисунокfigsize,dpi,facecolor,tight_layoutи т. д. можно установить следующим образом, чтобы установить цвет фона

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4],
    colors=["#232066", "#983D3D", "#DCB732"],
    facecolor='#DDDDDD'  # facecolor is a parameter of matplotlib.pyplot.figure
)

добавить другие элементы

В приведенном ниже примере мы используемtext()Метод добавления пользовательского водяного знака к графике

fig = plt.figure(
    FigureClass=Waffle,
    rows=5,
    values=[30, 16, 4]
)
fig.text(
    x=0.5,
    y=0.5,
    s="可以叫我才哥",
    ha="center",
    va="center",
    rotation=30,
    fontsize=40,
    color='gray',
    alpha=0.3,
    bbox={
        'boxstyle': 'square', 
        'lw': 3, 
        'ec': 'gray', 
        'fc': (0.9, 0.9, 0.9, 0.5), 
        'alpha': 0.3
    }
)