8 советов по лучшей визуализации данных
Практические советы по улучшению вашего GGPlot
Ggplot - лучший пакет визуализации данных R. Его популярность, вероятно, объясняется простотой использования - всего несколько строк кода, вы можете создавать отличные визуализации. Это особенно хорошо для новичков, которые только начинают свой путь в R, так как очень обнадеживает то, что вы можете создать что-то визуальное с помощью всего двух строк кода:
ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width)) + geom_point()
В этой статье я хочу выделить гибкость и настраиваемость ggplot. Альтернативы, такие как Matplotlib и Seaborn (оба Python) и Excel, также просты в использовании, но они менее настраиваемы. В этой статье я расскажу о 8 конкретных шагах, которые вы можете сделать, чтобы улучшить свой ggplot.
Чтобы убедиться в практическом применении советов в этой статье, я остановлюсь на двух темах:
- Предположим, что читатель немного знаком с ggplot: Если вы поняли фрагмент кода, приведенный выше, у вас все хорошо. Если вы не знакомы с ggplot, я постараюсь сделать советы как можно более независимыми от языка, поэтому, если вы используете базовый R, Python или другие инструменты визуализации, эти советы все равно могут быть полезны.
- Легко следовать: если вы хотите запустить пример кода самостоятельно, все, что вам нужно, это 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. Цвета!
Цвета служат двум ключевым целям при визуализации данных:
- Делает визуализацию более привлекательной
- Представляет дополнительное измерение данных
Есть много способов раскрасить ваши 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
или наоборот.
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()
.
- Фильтрация отображаемых ярлыков. Вы можете проявить творческий подход, но цель этого - показать только релевантные ярлыки данных. В приведенном ниже случае я хочу показать только цены на бриллианты в больших каратах:
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.