-
Notifications
You must be signed in to change notification settings - Fork 7
/
240-dynamic_viz.qmd
70 lines (54 loc) · 5.31 KB
/
240-dynamic_viz.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Динамические визуализации в R {#sec-vis_dynamic}
## Интерфейс для JavaScript фреймворков: пакет `htmlwidgets` {#html_w}
До этого мы делали только статические картинки, но в R можно делать динамические визуализации с интерактивными элементами! Делаются такие визуализации на основе *JavaScript*, в первую очередь, на основе фреймворка *D3.js*. Существует пакет для R `htmlwidgets`, который предоставляет интерфейс для работы с *JavaScript* визуализациями из R и вставлять их в *RMarkdown* или *Quarto* HTML-документы и веб-приложения *Shiny*. `htmlwidgets` --- это пакет, в первую очередь, для разработчиков R пакетов, которые делают на его основе очень простые и удобные в использовании R пакеты для создания динамических визуализаций и прочих динамических элементов.
```{r, include=FALSE}
library("tidyverse")
heroes <- read_csv("https://raw.githubusercontent.com/Pozdniakov/tidy_stats/master/data/heroes_information.csv",
na = c("-", "-99"))
df <- read_tsv("https://raw.githubusercontent.com/Pozdniakov/tidy_stats/master/data/meta_dataset.txt")
poli <- subset(df, subset=(Design=="Policy Change"))
meta_2_gg <- ggplot(aes(x=Outcome_age, y=Effect_size, size=1/(SE^2), colour = Design, fill = Design), data=df %>% filter(Design != "School Age Cutoff")) +
geom_point(alpha=.55) +
geom_hline(yintercept=0, linetype="dotted") +
theme_bw() +
scale_x_continuous(breaks=c(20,30,40,50,60,70,80)) +
xlab("Age at outcome test (years)") +
ylab("Gain for 1 year of education\n(IQ points)") +
guides(size=FALSE, colour = FALSE, fill = FALSE) +
geom_smooth(method="lm", size=.5, alpha=.25) +
ggtitle("Effect of education as a function of age at the outcome test")+
theme(plot.title = element_text(hjust=0.5)) +
facet_grid(Design~.)+
scale_colour_brewer(palette = "Set1")+
scale_fill_brewer(palette = "Set1")
```
## Динамические визуализации в `plotly` {#sec-plotly}
Один из самых распространенных средств для динамических визуализаций --- это пакет `plotly`.
```{r, eval = FALSE}
install.packages("plotly")
```
```{r}
library(plotly)
```
Есть два базовых способа использовать `plotly` в R. Первый --- это просто оборачивать готовые графики `ggplot2` с помощью функции `ggplotly()`.
```{r}
ggplotly(meta_2_gg)
```
Не всегда это получается так, как хотелось бы, но простота этого способа подкупает: теперь наведение на курсора на точки открывает небольшое окошко с дополнительной информацией о точке (конечно, если вы читаете эту книгу в PDF или ePUB, то этого не увидите).
Другой способ создания графиков --- создание вручную с помощью `plot_ly()`. Такой способ частично напоминает `ggplot2` использованием пайпов (обычных `%>%` или `|>`, а не `+`), задание эстетик здесь происходит с помощью `~`.
```{r}
plot_ly(poli,
x = ~Outcome_age,
y = ~Effect_size,
size = ~1/(SE^2),
color = ~Effect_size,
sizes = c(40, 400),
text = ~paste("N: ", n, '<br>Country:', Country)) %>%
add_markers()
```
## Другие пакеты для динамической визуализации {#sec-html_other}
Кроме `plotly` есть и множество других HTML-виджетов для динамической визуализации. Я рекомендую посмотреть их самостоятельно на <http://gallery.htmlwidgets.org/>
Выделю некоторые из них:
- [`echarts4r`](https://echarts4r.john-coene.com/articles/get_started.html) --- один из основных конкурентов для `plotly`. Симпатичный, работает довольно плавно, синтаксис тоже пытается вписаться в логику tidyverse.
- [`leaflet`](https://rstudio.github.io/leaflet/) --- основной (но не единственный!) пакет для работы с картами. Leaflet --- это очень популярная библиотека JavaScript, используемая во многих веб-приложениях, а пакет `leaflet` - это довольно понятный интерфейс к ней с широкими возможностями.
- [`networkD3`](http://christophergandrud.github.io/networkD3/) --- пакет для интерактивной визуализации сетей. Подходит для небольших сетей.