Создайте инфографику с помощью Matplotlib

Температурные режимы австралийских городов в 2019 году

Из моих предыдущих сообщений об иерархической структуре matplotlib построения графиков и множестве способов создания экземпляров axes мы видим, что эти функции предоставляют matplotlib большой потенциал для создания очень сложных и настраиваемых визуализаций. Чтобы продемонстрировать это, а также улучшить свое понимание matplotlib, на этой неделе я решил создать инфографику с использованием matplotlib.

Инфографика обычно объединяет визуальные образы, диаграммы данных и минимальный текст. Он призван проиллюстрировать простой для понимания обзор темы. Из-за этого его макет и содержание более сложны и разнообразны по сравнению с обычным графиком статических данных, который обычно показывает один тип данных в одном типе графика (например, столбик, точечная диаграмма, линия и прямоугольная диаграмма или их варианты ). Кроме того, инфографика может быть автономным графиком, в то время как график обычных статических данных в основном служит дополнительным материалом и должен читаться в определенном контексте.

Как вы, возможно, уже видели готовую инфографику из заголовка, которая показывает годовые модели суточной максимальной температуры и осадков в восьми крупных городах Австралии в 2019 году (Я очень надеюсь, что вы сможете понять эту тему, прежде чем читать этот абзац. я уверен, что продолжу). Моя инфографика была вдохновлена ​​этой инфографикой из South China Morning Post.

Мне лично очень нравится визуализировать большие объемы данных в виде сетки. Когда цвета и формы установлены соответствующим образом (например, кирпично-красный для высокой температуры и арктический голубой для низкой температуры в моем случае), он начинает передавать узоры, лежащие в основе замысловатости (например, менее арктический голубой лед по мере уменьшения широты), а также создает художественное ощущение (например, появление группы красных полос выглядит как горящее дерево).

Хорошо, без лишних слов, давайте теперь погрузимся в код и покажем вам, как я создал эту инфографику с помощью matplotlib. Как обычно, вы можете получить доступ ко всем необходимым данным и записной книжке jupyter из моего Github.

Определите цель и соберите данные

Хотя это выходит за рамки этой публикации, я перечисляю этот раздел, чтобы подчеркнуть, что это фундаментальная часть создания эффективной инфографики. Только если вы знаете, какую историю рассказать, у вас есть направление для сбора данных и размышлений о дизайне, макете, диаграммах и эстетике. В нашем случае данные о погоде были загружены с сайта австралийского Бюро метеорологии. Нам нужны только значения максимальной дневной температуры, названия города и даты (т.е. max_tmp_day, Город и Дата, как показано на рисунке 1 ).

Макет

Как было сказано в моем предыдущем сообщении, fig.add_axes([left, bottom, width, height]) - хороший способ вручную разместить axes на fig. Однако утомительно точно рассчитывать координаты для каждого axes на fig, когда у нас много axes (всего 18 axes) и требуется выравнивание (Наши глаза очень разборчивы, даже небольшое смещение приведет к нарушению баланса). Поэтому я принял сочетание общего макета и произвольного макета axes на fig. с использованием fig.add_gridspec() и fig.add_axes(). Здесь fig.add_gridspec() - это функция, которая позволяет нам указать геометрию сетки, в которую будет помещен axes. Например, представьте сетку 2 строки на 2 столбца на fig, обычно, если мы используем fig.subplots(nrows=2, ncols=2), это будет генерировать четыре axes, которые равномерно распределены по сетке 2 на 2. Что, если в сетке 2 на 2 нам нужно только 3 axes, чтобы первая axes занимала всю первую строку, а оставшиеся 2 axes равномерно занимали вторую строку? Здесь проявляется сила fig.add_gridspec(), которая позволяет нам создавать axes составных строк и столбцов по желанию. Мы можем достичь вышеупомянутого макета следующим образом:

fig = plt.figure()
# Use GridSpec for customising layout
gs = fig.add_gridspec(nrows=2, ncols=2)
# Add an empty axes that occupied the whole first row
ax1 = fig.add_subplot(gs[0, 0:2])
# Add two empty axes that occupied the remaining grid
ax2 = fig.add_subplot(gs[1, 0])
ax3 = fig.add_subplot(gs[1, 1])

Как видите, после создания объекта пространства сетки (т.е. gs) мы можем использовать его геометрию сетки, как и значения доступа из 2D numpy.ndarray, для размещения axes соответственно. Например, fig.add_subplot(gs[0, 0:2]) означает добавление axes, занимающего всю первую строку в сетке 2 на 2.

Вернемся к инфографике, как показано в приведенном выше коде, за исключением ax2 (оси цветной полосы), все остальные axes были добавлены fig.add_gridspec(nrows=10, ncols=10). В частности, в сетке 10 строк на 10 столбцов (рис. 2) ax1, который является axes для заголовка, текста и примечаний, занимает первые 2 строки и 8 столбцов. Каждый axes от ax3 до ax10, которые являются axes для построения шкалы температуры, занимает 1 строку и 8 столбцов. Наконец, каждый axes от ax11 до ax18, что составляет axes для данных об осадках, занимает только 1 строку и 2 столбца.

Как видите, fig.add_gridspec() - мощная функция, когда требуются гибкость и согласование нескольких axes.

Контент и цветовая схема

После подтверждения макета мы можем добавить графики данных. В качестве примера возьмем шкалу температуры (рис. 3).

Принимая во внимание как информацию, так и эстетику, каждая полоса представляет собой разницу между максимальной дневной температурой и среднегодовой температурой этих восьми крупных городов (24,43 ° C) в градусах Цельсия. Таким образом, аудитория может четко определить дни с температурой выше среднего (столбцы вверх) и температурой ниже среднего (столбцы вниз). В противном случае, поскольку значения температуры положительные, все столбцы будут в одном направлении выше нуля, что делает график столбиков скучным. Кроме того, в отличие от обычного столбчатого графика, я удалил все сетки, оси x и y и оставил только важные части.

Еще одна добавка - текстовая аннотация с изогнутыми стрелками, чтобы отдельно указывать дни с самой высокой и самой низкой температурой. Это добавляет гибкости всей инфографике с точки зрения эстетики. Это было доставлено ax.annotate(). В официальном документе о ax.annotate() приведены очень подробные примеры, поэтому я не буду повторять введение этой функции в этом посте.

Поскольку стиль столбчатых графиков температуры должен быть согласованным для всех этих восьми городов, нам просто нужно придумать коды для одного графика и добавить другие с помощью for loop (см. Код ниже).

Хотя цветовая схема - это очень субъективное решение, я могу поделиться принципами, которым я здесь руководствовался: создание контраста, группирование элементов и количество кодирования. В этой инфографике я использовал темный фон, чтобы сделать график температуры и круги дождя визуально заметными. Темный фон также отражал безрадостную атмосферу, отражающую чрезвычайную погодную ситуацию. Кроме того, использование согласованных цветов для гистограмм и кругов дождя, соответственно, помогло сгруппировать информацию вместе. Наконец, применение цветового спектра (от арктического ледяного синего до кирпично-красного) для различных значений температуры выдвинуло на первый план закономерности.

Заголовок, текст и примечания

Причина, по которой инфографика может быть отдельным сюжетом, заключается в том, что необходимый текст помогает усилить ее тему. Здесь мы можем использовать ax.text(), чтобы поместить любой текст, где захотим, на fig. Единственная ловушка, которую я обнаружил, - это то, что добавить собственное семейство шрифтов в matplotlib (одно решение здесь) - это немного хлопотно. Альтернативой является добавление текста через Illustrator после завершения основной части инфографики и экспорт в виде файла svg.

Как всегда, я приветствую отзывы, конструктивную критику и информацию о ваших проектах в области науки о данных. Со мной можно связаться в Linkedin, а также на моем сайте.