Сделайте визуализацию данных, которую запомнят люди. Единственное руководство для R, которое вам понадобится.

Язык визуализации данных универсален. Не все узнают отличную визуализацию, но все запомнят ужасную. Если вы используете инструменты и методы, описанные в этой статье, шансы, что ваша визуализация будет классифицирована как «ужасная», будут близки к нулю.

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

Сегодня вы научитесь:

  • Сделайте свою первую гистограмму
  • Изменить цвета и темы
  • Добавьте заголовки, субтитры и подписи
  • Редактировать метки осей
  • Создавайте составные, сгруппированные и горизонтальные гистограммы
  • Добавить ярлыки

Сделайте свою первую гистограмму

В R есть множество наборов данных, и тысячи других доступны в Интернете. Тем не менее, вы заявите о своем собственном. Причина проста - вы здесь, чтобы научиться создавать гистограммы, а не как агрегировать данные.

Вот набор данных, который вы будете использовать сегодня:

library(ggplot2)

data <- data.frame(
  quarter=c("Q1", "Q1", "Q2", "Q2", "Q3", "Q3", "Q4", "Q4"),
  product=c("A", "B", "A", "B", "A", "B", "A", "B"),
  profit=c(10, 14, 12, 11, 13, 15, 16, 18)
)

Стандартная библиотека R для визуализации данных - ggplot2. В его основе лежит принцип наслоения. Например, вы сначала объявляете уровень данных, а затем слой визуализации.

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

Для начала вы создадите гистограмму со столбцом quarter на оси x и profit на оси y. Это объявлено в первом слое (данные), а второй уровень (визуализация) определяет, какой тип визуализации вам нужен.

Слои geom_bar и geom_col используются для создания гистограмм. Для первого варианта вам нужно указать stat = "identity", чтобы он работал, поэтому лестница используется на протяжении всей статьи.

Вы можете создать простую гистограмму с помощью этого кода:

ggplot(data, aes(x = quarter, y = profit)) + 
  geom_col()

Вот соответствующая визуализация:

Этот выполняет свою работу, но не похоже на то, что вы хотели бы показывать своему боссу. Вы исправите это в следующих разделах.

Цвета и темы

Настройка цветов и тем - это самое простое, что вы можете сделать, чтобы визуализация выглядела лучше. geom_bar() имеет два полезных параметра:

  • color - цвет контура полос
  • fill - цвет заливки полос

Вот как с помощью fill сделать диаграмму синей:

ggplot(data, aes(x = quarter, y = profit)) + 
  geom_col(fill = "#0099f9")

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

Вот что это означает на практике. В приведенном ниже фрагменте кода устанавливается белый цвет заливки и синий цвет контура:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(color = "#0099f9", fill = "#ffffff")

Если раскраска не помогает, вы можете полностью изменить тему. Это еще один слой, который нужно добавить после начального слоя визуализации. Вот как это сделать:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  theme_classic()

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

Заголовки, субтитры и подписи

Визуализация без названия бесполезна. Невозможно узнать, смотрите ли вы на голоса на выборах или на голоса на выборах в США 2020 года в Калифорнии. Вы можете использовать субтитры для добавления дополнительной информации, но это не обязательно. Подписи полезны для размещения кредитов визуализации и источников.

Самый удобный способ добавить их - через слой labs(). Принимает значения для title, subtitle и caption.

Давайте посмотрим, как сложить все три:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  labs(
    title = "Quarterly Profit (in million U.S. dollars)",
    subtitle = "A simple bar chart",
    caption = "Source: ImaginaryCo"
  )

Это хорошее начало, но что, если вы хотите добавить стили? Давайте посмотрим, как раскрасить заголовок, выделить подзаголовок жирным шрифтом и выделить заголовок курсивом:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  labs(
    title = "Quarterly Profit (in million U.S. dollars)",
    subtitle = "A simple bar chart",
    caption = "Source: ImaginaryCo"
  ) +
  theme(
    plot.title = element_text(color = "#0099f9", size = 20),
    plot.subtitle = element_text(face = "bold"),
    plot.caption = element_text(face = "italic")
  )

Давайте сделаем еще один шаг вперед. Вот как выровнять заголовок по центру, подзаголовок - справа, а заголовок - слева:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  labs(
    title = "Quarterly Profit (in million U.S. dollars)",
    subtitle = "A simple bar chart",
    caption = "Source: ImaginaryCo"
  ) +
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 1),
    plot.caption = element_text(hjust = 0)
  )

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

Ярлыки осей

Короче - работает идентично, как с заголовками, так и с субтитрами. Слой labs() принимает значения для меток оси X и Y.

Вот как изменить текст:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  labs(
    x = "Quarter of 2020",
    y = "Profit in 2020"
  )

Вы можете изменить стили так же, как и с заголовками, субтитрами и подписями. Следующий фрагмент кода сделает вашу метку оси X синим и жирным шрифтом, а метку оси Y - курсивом:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  labs(
    x = "Quarter of 2020",
    y = "Profit in 2020"
  ) +
  theme(
    axis.title.x = element_text(color = "#0099f9", size = 15, face = "bold"),
    axis.title.y = element_text(size = 15, face = "italic")
  )

И это касается изменения основных визуальных эффектов. Далее вы узнаете, как работать с различными гистограммами - составными, сгруппированными и горизонтальными.

Сложенные, сгруппированные и горизонтальные гистограммы

Пакет ggplot2 по умолчанию использует гистограммы с накоплением. Столбчатые диаграммы с накоплением лучше всего использовать, когда все части окрашены по-разному.

Чтобы изменить окраску, вам нужно только изменить значение fill на уровне данных. Вот пример:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col()

Между продуктами заметно различие, и теперь вы можете видеть, какую прибыль приносил каждый продукт в квартал.

Изменить цвет каждой порции можно двумя способами:

  • Вручную - указав вектор названий цветов или шестнадцатеричных кодов цветов.
  • С палитрами - с помощью встроенных цветовых палитр.

Давайте сначала рассмотрим ручной подход. Вам нужно добавить слой с scale_fill_manual:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col() +
  scale_fill_manual(values = c("#69c6ff", "#0099f9"))

Палитры немного проще, потому что вам не нужно знать точные значения цвета. По той же причине это также можно рассматривать как ограничение. Вот список встроенных палитр. Слой scale_fill_brewer используется для работы с палитрами:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col() +
  scale_fill_brewer(palette = "Set1")

Теперь на сгруппированные гистограммы. Они отображают полосы, соответствующие группе, рядом друг с другом, а не поверх друг друга. Чтобы использовать сгруппированные гистограммы, вам нужно поместить position = position_dodge() в слой geom_bar:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col(position = position_dodge())

Вы можете изменить окраску так же, как и для гистограмм с накоплением - через слои scale_fill_manual или scale_fill_brewer. Вот пример:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col(position = position_dodge()) +
  scale_fill_manual(values = c("#3db5ff", "#0099f9"))

Наконец, давайте рассмотрим горизонтальные гистограммы. Они полезны, когда на оси абсцисс много категорий или когда их имена длинные. coord_flip() используется для превращения любой вертикальной гистограммы в горизонтальную:

ggplot(data, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  coord_flip()

Вы можете использовать слои scale_fill_manual или scale_fill_brewer, чтобы изменить цвет. Вот пример:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col(position = position_dodge()) +
  scale_fill_manual(values = c("#3db5ff", "#0099f9")) +
  coord_flip()

Теперь вы знаете, как создавать гистограммы любого типа, но есть еще одну вещь, которую можно улучшить. Посмотрим, что это такое в следующем разделе.

Этикетки

На гистограммы бывает трудно смотреть. Часто требуется знать точное значение. Если ось Y находится в масштабе миллионов, считывание значений из диаграммы становится приближением (в лучшем случае). Вот тут-то и нужны лейблы.

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

Вы узнаете, как размещать ярлыки поверх полос. В первом примере вам нужно отфильтровать набор данных, чтобы отображался только продукт A. Причина проста - ggplot2 по умолчанию использует гистограммы с накоплением, и в каждом квартале в стеке есть два продукта.

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

Вот код:

library(dplyr)

data_a <- data %>%
  filter(product == "A")

ggplot(data_a, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  geom_text(aes(label = profit), vjust = -0.5, size = 5)

Но что, если вы хотите поместить ярлыки внутрь? Просто немного поиграйте с vjust. Установка его на 2 дает трюк:

ggplot(data_a, aes(x = quarter, y = profit)) +
  geom_col(fill = "#0099f9") +
  geom_text(aes(label = profit), vjust = 2, size = 5, color = "#ffffff")

Все становится немного сложнее, если вам нужны этикетки для нескольких стопок. Вы должны указать position = position_stack() внутри слоя geom_text. Установка vjust на 0,5 делает их центрированными:

ggplot(data, aes(x = quarter, y = profit, fill = product, label = profit)) +
  geom_col() +
  scale_fill_manual(values = c("#3db5ff", "#0099f9")) +
  geom_text(position = position_stack(vjust = 0.5), size = 4, color = "#ffffff")

Есть альтернатива для сгруппированной гистограммы. Вам нужно будет указать position = position_dodge(), чтобы он работал. Этот код центрирует метки внутри каждой группы:

ggplot(data, aes(x = quarter, y = profit, fill = product)) +
  geom_col(position = position_dodge()) +
  scale_fill_manual(values = c("#3db5ff", "#0099f9")) +
  geom_text(aes(label = profit), position = position_dodge(0.9), vjust = 2, size = 4, color = "#ffffff")

И это все, что касается ярлыков и гистограмм. Давайте подведем итоги.

Вывод

Сегодня вы узнали, как создать гистограмму любого типа в R и как настроить ее с помощью цветов, заголовков, субтитров и меток. Теперь вы можете использовать гистограммы для базовой визуализации, отчетов и панелей мониторинга.

Вы новичок в R? Ознакомьтесь с этим подробным руководством по R для программистов.

Первоначально опубликовано на https://appsilon.com 7 декабря 2020 г.