Тема 2: Визуализация данных

Лекция 4. Расширения и дополнительные возможности ggplot2

Большие данные и аналитика
Бизнес-информатика 38.03.05 (бакалавриат)

Полезные источники по ggplot2

Книги

ggplot2: Elegant Graphics for Data Analysis

Data Visualization. A practical introduction

Modern Data Visualization with R

Визуализация данных с помощью ggplot2

Глава Грамматика графики ggplot2 книги Анализ данных и статистика в R

Курсы

Claus O. Wilke: Data Visualization in R на основе его книги Fundamentals of Data Visualization

Cédric Scherer:
Engaging and Beautiful Data Visualizations with ggplot2
Graphic Design with ggplot2
Designing Data Visualizations to Successfully Tell a Story

Andrew Heiss: Data Visualization with R

Ресурсы

Awesome ggplot2

awesome-r-dataviz

Top 50 ggplot2 Visualizations

My favorite ggplot2 packages with examples

My Favorite ggplot2 Extension Packages

ggplot2 tricks

Расширения ggplot2

Страница расширений

ggplot2 extensions

ggrepel

ggrepel

library(ggrepel)

standard_repel + 
  geom_text_repel(alpha = 0.6, 
                  color = "black",
                  size = 3.5)


Библиотека {ggrepel} создает неперекрывающиеся текстовые метки в {ggplot2} графиках.

ggrepel

ggrepel

patchwork

library(ggplot2)
library(patchwork)

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + ggtitle("График 1")
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear)) + ggtitle("График 2")
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec)) + ggtitle("График 3")
p4 <- ggplot(mtcars) + geom_bar(aes(carb)) + ggtitle("График 4")

(p1 | p2 | p3) /
  p4


Библиотека {patchwork} позволяет комбинировать графики.

patchwork

GGally

library(GGally)

ggpairs(tips, mapping = aes(color = sex), 
        columns = c("total_bill", "time", "tip"))
# A tibble: 6 × 7
  total_bill   tip sex    smoker day   time    size
       <dbl> <dbl> <fct>  <fct>  <fct> <fct>  <int>
1       17.0  1.01 Female No     Sun   Dinner     2
2       10.3  1.66 Male   No     Sun   Dinner     3
3       21.0  3.5  Male   No     Sun   Dinner     3
4       23.7  3.31 Male   No     Sun   Dinner     2
5       24.6  3.61 Female No     Sun   Dinner     4
6       25.3  4.71 Male   No     Sun   Dinner     4


Библиотека {GGally} строит различные статистические графики, в том числе визуализирует корреляции в зависимости от типов данных.

GGally

ggridges

library(ggridges)

ridges_graph + 
  geom_density_ridges_gradient(scale = 3, 
                               rel_min_height = 0.01,
                               linewidth = 0.4,
                               bandwidth = 1.7)


Библиотека {ggridges} позволяет делать «хребтовые диаграммы».

ggridges

ggdist

library(ggdist)

ggdist_graph + 
    stat_gradientinterval(.width = 1:4*.25, 
                        scale = 0.4,
                        alpha = 0.9) +


Библиотека {ggdist} визуализирует одномерные распределения.

ggdist

ggforce

library(ggforce)

gg_plot +
  geom_mark_ellipse(aes(label = species),
                    linewidth = 0.5,
                    show.legend = FALSE)


Библиотека {ggforce} добавляет множество дополнительных функций к {ggplot2}, например, аннотирование.

ggforce

ggforce

ggtext

legendry

library(legendry)

standard +
  aes(colour = cty) +
  scale_colour_viridis_c(
    option = "C",
    guide = compose_sandwich(
      middle = gizmo_density(just = 1), 
      text = "axis_base"
    )
  ) +
  labs(colour = "Расход в городе, \nмиль на галлон")


Библиотека {legendry} добавляет дополнительную функциональность легендам {ggplot2}.

legendry

legendry

range_key <- key_range_manual(start = 2:3, end = 5:6, 
                              name = c("Первый класс", "Второй класс"))
                           
standard +
  aes(colour = cty) +
  scale_colour_viridis_c(
    option = "C",
    guide = compose_sandwich(
      middle = gizmo_density(just = 1), 
      text = "axis_base"
    )
  ) +
  labs(colour = "Расход в городе, \nмиль на галлон")  +
  guides(x = compose_stack(
    "axis_base",
    primitive_bracket(range_key, "curvy"),
    primitive_box(range_key),
    primitive_spacer(unit(0.2, "cm"))
  ))

legendry

Анимация и интерактив

gganimate

gganimate

library(gganimate)

base_gg + 
  transition_time(year) +
  labs(title = "Год: {frame_time}")


Библиотека {gganimate} создает преобразование анимации на основе {ggplot2}.

gganimate

ggiraph

library(ggiraph)

ggiraph::girafe(
  ggobj = ggplot2_plot, width_svg = 8, height_svg = 4,
  options = list(
    ggiraph::opts_hover_inv(css = "opacity:0.3;"),
    ggiraph::opts_hover(css = "stroke-width:5;")
  )
)


Библиотека {ggiraph} может легко превратить {ggplot2} график в интерактивный.

ggiraph (график интерактивный!)

Темы ggplot2

Как изменить тему?

gg_plot +
  ggpubr::theme_pubr() +
  silgelib::theme_roboto() +
  hrbrthemes::theme_ipsum() +
  NULL


В {ggplot2} можно использовать различные темы, предварительно установив соответствующие библиотеки.

Приведем 3 примера различных тем: {ggpubr}, {silgelib} и {hrbrthemes}.

Базовый график

ggpubr

silgelib

hrbrthemes

Функциональные возможности

Информационные слои

library(ggside)

gg_side_plot +
  geom_xsideboxplot(aes(y = species), 
                    orientation = "y",
                    alpha = 0.8) +
  geom_ysidedensity(aes(x = after_stat(density)), 
                    position = "identity",
                    alpha = 0.8) +
  scale_ysidex_continuous(guide = guide_axis(angle = 90), 
                          minor_breaks = NULL) +
  theme(ggside.panel.scale = 0.3)

Информационные слои

Увеличение части графика

library(ggforce)

gg_for_scale + 
  facet_zoom(xlim = c(40, 50), 
             show.area = TRUE)

Увеличение части графика

Увеличение части графика

library(ggforce)

gg_for_scale + 
  facet_zoom(xy = species == "Chinstrap", 
             split = TRUE)

Увеличение части графика

Статистические графики

set.seed(2024)
library(ggstatsplot)

ggbetweenstats(
  data  = penguins |> na.omit(),
  x     = species,
  y     = bill_length_mm
)

Статистические графики

Результаты моделирования

# библиотека для реализации метода деревьев решений
library(partykit)

# библиотека для отображения деревьев решений
library(ggparty)
# дерево решений
penguin_ctree <- ctree(
  # формула, показывающая зависимости
  species ~ flipper_length_mm + bill_length_mm,
  data = penguins |> na.omit()
)

Результаты моделирования

penguin_ctree

Model formula:
species ~ flipper_length_mm + bill_length_mm

Fitted party:
[1] root
|   [2] flipper_length_mm <= 206
|   |   [3] bill_length_mm <= 43.2
|   |   |   [4] bill_length_mm <= 42.3: Adelie (n = 134, err = 0.7%)
|   |   |   [5] bill_length_mm > 42.3: Adelie (n = 11, err = 36.4%)
|   |   [6] bill_length_mm > 43.2: Chinstrap (n = 63, err = 7.9%)
|   [7] flipper_length_mm > 206
|   |   [8] bill_length_mm <= 44.1: Gentoo (n = 18, err = 11.1%)
|   |   [9] bill_length_mm > 44.1
|   |   |   [10] flipper_length_mm <= 212
|   |   |   |   [11] bill_length_mm <= 48.2: Gentoo (n = 19, err = 0.0%)
|   |   |   |   [12] bill_length_mm > 48.2: Chinstrap (n = 8, err = 37.5%)
|   |   |   [13] flipper_length_mm > 212: Gentoo (n = 80, err = 0.0%)

Number of inner nodes:    6
Number of terminal nodes: 7

Результаты моделирования

autoplot(penguin_ctree) + 
  theme_void()

Результаты моделирования

Результаты моделирования

# визуализирует подгонку деревьев решений
library(parttree)

gg_for_tree +
  geom_parttree(data = penguin_ctree, 
                aes(fill = species), 
                alpha = 0.2)

Результаты моделирования

Изменение цветовой шкалы

Базовый график/карта

В качестве исходных данных выберем North Carolina SIDS data. Пусть цвет соответствует площади полигонов графств.

Базовый график/карта

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), 
                  quiet = TRUE)
Simple feature collection with 5 features and 14 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -81.74107 ymin: 36.07282 xmax: -75.77316 ymax: 36.58965
Geodetic CRS:  NAD27
   AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
1 0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
2 0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
3 0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
4 0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
5 0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
  NWBIR74 BIR79 SID79 NWBIR79                       geometry
1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
2      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
3     208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
4     123   830     2     145 MULTIPOLYGON (((-76.00897 3...
5    1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...

Базовый график/карта

gg_map <- ggplot(nc) +
  geom_sf(aes(fill = AREA),
          color = "black",
          linewidth = 0.2) +
  labs(fill = "площадь") +
  hrbrthemes::theme_ipsum() +
  guides(fill = guide_colorbar(title.position = "top", 
                               title.hjust = 0.5,
                               barwidth = unit(20, "lines"), 
                               barheight = unit(0.7, "lines"))) +
  theme(legend.position = "top",
        legend.text = element_text(size = 12),
        legend.title = element_text(size = 14))

Смещение цветовой шкалы

Выберем палитру с помощью библиотеки {paletteer} из набора цветовых палитр, добавив в код графика

+ paletteer::scale_fill_paletteer_*("ggthemes::palette_name", 
                                    direction = -1)

При этом обязательно нужно указать направление цвета (direction = 1 или direction = -1).

Например, для интервальной шкалы можно выбрать среднюю точку с помощью команды rescaler = ~ rescale_mid(.x, mid = mid_point_value).

Смещение цветовой шкалы

Пусть новые цвета соответствуют шкале ggthemes::Classic Orange-Blue, а центр цветовой палитры соответствует значению 0.2.

library(paletteer)

gg_map +
  scale_fill_paletteer_c("ggthemes::Classic Orange-Blue", 
                         direction = -1,
                         rescaler = ~ rescale_mid(.x, mid = 0.20)
  )

Смещение цветовой шкалы

Смещение цветовой шкалы

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

gg_map +
  paletteer::scale_fill_paletteer_c("ggthemes::Classic Orange-Blue", 
                                    direction = -1,
                                    limits = ~ c(0, 1) * max(abs(.x))
  )

Смещение цветовой шкалы

Еще больше расширений ggplot2

…слои

  • {ggdensity} — 2D-графики плотности
  • {geofacet} — плиточные карты
  • {ggalluvial} — аллювиальные графики
  • {ggbump} — бамп-чарты
  • {ggalt} — гантельные графики, леденцовые графики, сплайны
  • {ggpattern} — паттерны: заполнение геометрическими и графическими узорами
  • {ggbeeswarm} — графики в стиле пчелиного роя
  • {ggbraid} — заполнение области между двумя чередующимися линиями

…слои

  • {geomtextpath} — текст может следовать по любой траектории
  • {ggraph} — сети, графы и деревья
  • {ggsankey} — диаграммы Sankey
  • {ggstream} — составной график областей, в основном используемый для временных рядов
  • {ggupset} — UpSet графики для обозначения сложных соотношений между элементами множеств
  • {treemapify} — древовидные карты

…утилиты

  • {scales} — шкалы
  • {ggnewscale} — использование нескольких шкал
  • {cowplot} — комбинирование графиков
  • {ggblend} — смешивание графиков
  • {ggfx} — использование различных фильтров и шейдеров на слоях {ggplot2}
  • {ggh4x} — tweaking {ggplot2}
  • {ggannotate} — аннотирование

…темы

Что мы изучили

Рассмотренные вопросы

  • Полезные источники по {ggplot2}
  • Расширения {ggplot2}
  • Анимация и интерактив на основе {ggplot2}
  • Темы {ggplot2}
  • Функциональные возможности {ggplot2}
  • Изменение цветовой шкалы

Спасибо за внимание!