8 советов по лучшей визуализации данных

Практические советы по улучшению вашего GGPlot

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

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) +
  geom_point()

В этой статье я хочу выделить гибкость и настраиваемость ggplot. Альтернативы, такие как Matplotlib и Seaborn (оба Python) и Excel, также просты в использовании, но они менее настраиваемы. В этой статье я расскажу о 8 конкретных шагах, которые вы можете сделать, чтобы улучшить свой ggplot.

Чтобы убедиться в практическом применении советов в этой статье, я остановлюсь на двух темах:

  1. Предположим, что читатель немного знаком с ggplot: Если вы поняли фрагмент кода, приведенный выше, у вас все хорошо. Если вы не знакомы с ggplot, я постараюсь сделать советы как можно более независимыми от языка, поэтому, если вы используете базовый R, Python или другие инструменты визуализации, эти советы все равно могут быть полезны.
  2. Легко следовать: если вы хотите запустить пример кода самостоятельно, все, что вам нужно, это R и tidyverse. Никаких внешних наборов данных не требуется, поскольку мы будем использовать набор данных diamonds, который включен в ggplot.

1. Темы - ваш лучший друг

Темы управляют всем отображением, не связанным с данными, и являются простым способом изменить внешний вид вашего графика. Для этого требуется всего одна дополнительная строка кода, а в ggplot уже есть 8 отдельных тем.

ggplot(data = diamonds, aes(x = Sepal.Width, y = Sepal.Length)) + 
  geom_point() + 
  theme_bw()

Темы ggplot просты. Они не особо выделяются, но они великолепно выглядят, легко читаются и передают суть. Кроме того, если вы хотите использовать одну и ту же тему снова и снова, вы можете установить глобальную тему с помощью одной строки кода, и она будет применяться ко всем ggplots.

# Set global theme
theme_set(theme_bw())

Для получения более подробной информации по 8 темам вы можете посетить эту ссылку.

Темы также легко настраиваются. Помимо 8 тем, которые поставляются с ggplot, вы также можете создать свою собственную тему, но, что более важно, использовать темы, которые уже были созданы другими. В нескольких компаниях, в которых я работал, у всех были внутренние темы ggplot. Например, я помог создать theme_fb() в Facebook при участии дизайнеров компании.

Если вы хотите использовать другие темы вне ggplot, наиболее популярным пакетом является ggthemes, в котором есть несколько интересных опций, например theme_fivethirtyeight(), theme_wsj(), and theme_economist(). Примеры этих тем приведены ниже, но я определенно рекомендую проверить эту ссылку, чтобы узнать больше.

2. Facets - это сверхдержава.

При визуализации данных всегда нужно думать о том, сколько измерений данных вы хотите отобразить. Большинству графиков, как правило, требуется только 1-2 измерения данных, чтобы понять суть, например:

  • Рост x вес баскетболистов на диаграмме рассеяния
  • Рост игроков в Лос-Анджелес Лейкерс на гистограмме

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

  • Рост x вес баскетболистов на диаграмме рассеяния, но разные цветные точки для каждой из 30 команд. Это будет трудно прочитать, потому что вам понадобится 30 разных цветов для обозначения разных команд и легенда, чтобы перечислить все названия команд.

Вот где сияет магия огранки. Что, если нам не нужно ограничиваться одним графиком? Моя гипотеза, почему многие из нас думают так, состоит в том, что мы привыкли визуализировать данные в Excel, где мы ограничены одним график. В ggplot мы можем нарушить этот способ мышления, и для этого требуется всего одна строчка кода. Фасеты позволяют нам легко добавлять до двух дополнительных измерений в наши визуализации.

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

На базовом уровне мы можем увидеть взаимосвязь между каратом алмаза и его ценой, что является основной целью этого набора данных:

ex2 <- 
  diamonds %>%
  sample_n(5000) %>%
  ggplot(aes(x = carat, y = price)) +
  geom_point()
ex2

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

Используйте facet_wrap (), если вы хотите разбить график только по одному измерению:

ex2 +
  facet_wrap(~cut)

Используйте facet_grid (), если вы хотите разбить график на два измерения:

ex2 +
  facet_grid(color~cut)

Это всего лишь два примера того, как вы можете использовать facet_wrap() и facet_grid(), но ключевой вывод из этого раздела заключается в том, что с ggplot вы не ограничены мыслями о визуализации в одном графике.

3. Цвета!

Цвета служат двум ключевым целям при визуализации данных:

  1. Делает визуализацию более привлекательной
  2. Представляет дополнительное измерение данных

Есть много способов раскрасить ваши ggplots, но для простоты в этом разделе основное внимание уделяется палитрам Viridis, которые мне больше всего нравятся:

  • Цветные: максимально широкая палитра, чтобы можно было легко увидеть различия.
  • Однородные по восприятию: значения, близкие друг к другу, имеют похожие цвета, а значения, расположенные на большом расстоянии друг от друга, имеют более разные цвета, последовательно во всем диапазоне значений.
  • Устойчивость к дальтонизму: чтобы вышеуказанные свойства были верны для людей с распространенными формами дальтонизма, а также при печати с оттенками серого.

Вы можете узнать больше о цветах, приведенных выше здесь, но в этом разделе основное внимание уделяется 4 ключевым функциям, которые позволяют использовать эти цвета:

  • scale_color_viridis_d() & scale_fill_viridis_d(): добавьте этот оператор в свой график ggplot, чтобы раскрасить / заполнить график дискретной / категориальной переменной. (обратите внимание на букву «d» в конце функции)
  • scale_color_viridis_c() & scale_fill_viridis_c(): добавьте этот оператор в свой график ggplot, чтобы раскрасить / заполнить график на непрерывной переменной. (Обратите внимание на букву «c» в конце функции)
# Discrete
ggplot(data = diamonds %>% sample_n(1e3), 
         aes(x = carat, y = price,
             color = cut)) + 
  geom_point() +
  scale_color_viridis_d()

# Continuous
ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price,
           color = depth)) + 
  geom_point() +
  scale_color_viridis_c(option = 'A')

Совет: здесь я использую параметр option, чтобы изменить цветовую палитру в viridis. Вы можете переключаться между вариантами A – E, которые отражают различные цветовые схемы, указанные выше.

4. Цвет против заливки: узнайте разницу

Я представил это в последнем разделе, но я хотел рассмотреть его более подробно, потому что это может сбивать с толку при первом использовании ggplot. Чтобы раскрасить график ggplot, используйте color или fill, в зависимости от типа графика.

Так в чем разница? Как правило, fill определяет цвет, которым заполнен (т.е. geom_bar()), тогда как color определяет цвет, которым геом обведены (т.е. geom_point()).

ggplot(data = diamonds, aes(x = price)) +
  geom_histogram(color = 'blue',
                 fill = 'red')

Вывод: если вы попытаетесь раскрасить график и окажется, что ничего не изменилось, просто переключите color на fill или наоборот.

Подробнее о StackOverflow

5. Наклейте на него этикетку.

Хорошие визуализации имеют краткие и описательные метки. Они помогают читателям понять, что они видят, и это особенно важно, если вы ожидаете, что вашей визуализацией будут делиться. К счастью, пометить в ggplot очень просто.

Ниже приведены наиболее полезные функции маркировки ggplot с указанием того, как часто их, вероятно, следует использовать. Вы можете выбрать, какие метки вы хотите использовать - например, если вы хотите только добавить заголовок, вы нужно только ввести параметр заголовка в labs().

ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point() +
  labs(title = 'title example',
       x = 'x-axis example',
       y = 'y-axis example',
       color = 'color example',
       subtitle = 'subtitle example',
       caption = 'caption example',
       tag = 'tag example')

Примечание. Поле цвета доступно только в том случае, если у вас есть цвет в качестве эстетики в вашем графике ggplot. Этот метод маркировки также будет работать независимо от того, используете ли вы заливку, цвет, размер, альфа-канал и т. Д.

6. Аннотации к линиям

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

  • Отметка периода до / после на линейном графике
  • Нанесение среднего значения x или y на диаграмму рассеяния
  • Аннотирование целевого показателя, которого мы хотим достичь

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

  • geom_hline (): добавляет горизонтальную линию (имеет точку пересечения y)
  • geom_vline (): добавляет вертикальную линию (имеет точку пересечения с x).

В приведенном ниже примере будут показаны оба эти действия в действии:

ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point() +
  geom_hline(data = . %>% summarise(y = mean(price)),
             aes(yintercept = y)) +
  geom_vline(data = . %>% summarise(x = mean(carat)),
             aes(xintercept = x))

Обратите внимание, что приведенный выше код может выглядеть немного сложнее, чем другой код ggplot в этой статье. Я постараюсь объяснить, что там происходит. Чтобы получить среднее значение в каратах и ​​цене, более простой способ получить эти значения - это вычислить их до ввода кода ggplot. Однако, поскольку я ленив и люблю сокращать количество переменных, которые у меня есть, я вместо этого передаю данные (diamonds %>% sample_n(1e3)) непосредственно в операторы geom_line(), которые работают так же хорошо.

7. Текстовые аннотации

В дополнение к линиям всегда полезно иметь какие-то метки данных на ваших графиках. Однако это будет полезно только в том случае, если ваши метки данных легко читаются. Например, если вы слепо примените геометрию текста, вы получите действительно уродливый график:

p <- 
  ggplot(data = diamonds %>% sample_n(1e3), 
       aes(x = carat, y = price, color = cut)) + 
  geom_point()
p + 
  geom_text(aes(label = price))

В этом разделе я расскажу о трех ключевых советах по эффективному использованию geom_text().

  1. Фильтрация отображаемых ярлыков. Вы можете проявить творческий подход, но цель этого - показать только релевантные ярлыки данных. В приведенном ниже случае я хочу показать только цены на бриллианты в больших каратах:
p + 
  geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price))

2. hjust + vjust

На приведенном выше графике вы увидите, что текст полностью перекрывает точку, что выглядит некрасиво. Вы можете легко исправить это, выровняв текст в geom_text (). То, что я думаю об этом, похоже на выравнивание по левому и правому краю в Microsoft Word.

Как правило, диапазон значений vjust и hjust составляет от [0,1], но он также принимает отрицательные значения и значения больше единицы (он просто перемещает вашу метку дальше в указанном направлении). На приведенном ниже графике показано, как текст будет выровнен на основе ваших значений hjust и vjust:

p + 
  geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price),
            hjust = 0,
            vjust = 0)

3. цвет

Это скорее предпочтение, но знайте, что вы можете изменить цвет текста. Обычно вам нужно, чтобы ваш текст максимально контрастировал с фоном, так как это сделает его наиболее разборчивым. Это важно, если у вас есть более светлые цвета (например, желтый), которые могут быть трудночитаемыми:

p + 
  geom_text(data = . %>% filter(carat >= 2.25),
            aes(label = price),
            hjust = 0,
            vjust = 0,
            color = 'black')

# Another example where we add contrast
diamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = clarity, y = price)) +
  geom_bar(stat = 'identity') +
  geom_text(aes(label = round(price, 2)),
            vjust = 1.25,
            color = 'white')

8. Заказ, заказ, заказ!

Наконец, упорядочение графика может облегчить чтение, и это особенно полезно для гистограмм. Все, что вам нужно сделать, это использовать fct_reorder() для значения x, чтобы оно было отсортировано по значению y:

# By default, ggplot will order by the x value
diamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = clarity, y = price)) +
  geom_bar(stat = 'identity')

# Reordered:
diamonds %>%
  group_by(clarity) %>%
  summarise(price = mean(price)) %>%
  ggplot(aes(x = fct_reorder(clarity, price), y = price)) +
  geom_bar(stat = 'identity')

Заключительные мысли

Мне было сложно решить, какие темы я хочу осветить в этой статье. В итоге я сосредоточился на темах, которые изначально сбивали меня с толку и которые я хотел бы понять больше, когда впервые начал изучать ggplot. Надеюсь, эта статья даст вам некоторые конкретные идеи о том, как улучшить визуализацию или проясняет некоторые из наиболее сбивающих с толку / скрытых аспектов ggplot.