В R можно нарисовать практически любой график. Главное ограничение - необходимость использовать двумерные проекции, т.к. работаем с плоскостью.
Первый, самый важный, и шаг, который программа за вас не сделает - это представить, вообразить график, который вы хотите видеть. То есть быть готовым изобразить его от руки.
R часто заставляет задумываться о базовых вещах и здесь нужно представлять себе желаемый график до мелочей.
- заставить смотрящего задуматься о содержании данных, а не о методе, дизайне, технологии или чем-то еще;
- показать много информации в небольшом пространстве;
избежать искажения того, о чем говорят данные;
Зависит от цели коммуникации, конвенций и типа данных.
http://extremepresentation.typepad.com/files/choosing-a-good-chart-09.pdf
сделать большой объем данных легким для восприятия;
помогать сравнивать разные части информации;
- демонстрировать разные уровни детализации информации;
Цели:
Тип:
https://www.gapminder.org/tools/ Ханса Рослинга
Можно думать о графиках не как об отдельных типах, а как о комбинации отдельных элементов
❗️ Каждое из выразительных средств должно соответствовать одной переменной.
или фигуры: прямоугольники, треугольники, круги, шестиугольники.
HEX colors - шестизначное обозначение цвета в формате #RRGGBBTT: 0- 9, A-F.
RR - red, GG - green, BB - blue, TT - transparency.
Например,
plot(1:10, type="n", xlab="x", ylab="y")
polygon(c(1, 2, 2, 1), c(2, 2, 4, 4), col="#FF0000") # чистый красный
polygon(c(2, 4, 4, 2), c(2, 2, 4, 4), col="#BF0000") # более темный красный
polygon(c(4, 6, 6, 4), c(2, 2, 4, 4), col="#0000BF") # темный синий
polygon(c(6, 8, 8, 6), c(2, 2, 4, 4), col="#FFFFFF") # белый
polygon(c(8, 9, 9, 8), c(2, 2, 4, 4), col="#000000") # черный
Встроенные colors()
- выбрать можно через RStudio -> кнопка Addins -> Color Picker (устанавливается как пакет colourpicker
).
Функция rgb(1,0,0, .5) - red, green, blue, transparency.
library(viridis)
data.for.contour <- png::readPNG("images/logo.png")[,,3]
data.for.contour <- (t(data.for.contour)[,nrow(data.for.contour):1])
filled.contour( z=data.for.contour, color.palette = viridis)
Прежде всего нужно определиться на каком “листе” будем изображать.
что происходит
https://extremepresentation.com/design/audience/
Как и во всех презентациях, коммуникация более успешна если есть история.
Онлайн-книга с основами: https://socviz.co/
Бесплатный курс по d3, содержит лекции с теор.основами визуализации данных: https://www.udacity.com/course/data-visualization-and-d3js--ud507
Объяснение результатов исследования широкой публике с использованием методов визуализации, когда у читателей создается впечатление открытия.
визуально привлекательные,
понятные неспециалисту,
с открытыми данными и возможностью проверки экспертами.
https://www.pewresearch.org/politics/2021/05/17/public-trust-in-government-1958-2021/
Галерея странных графиков: http://xeno.graphics/
Галерея библиотеки d3.js:
gg = Grammar of Graphics, Леланд Вилкинсон https://link.springer.com/content/pdf/10.1007%2F0-387-28695-0.pdf
Слоевая грамматика графики, послоевое построение
График - это данные, представленные с помощью символов.
Вместо изображения каждого элемента по отдельности, можно их последовательно комбинировать с помощью похожего на естественный язык алгоритма.
Какие переменные, как они обрабатываются, в какой последовательности сортируются значения, какие статистики вычисляются, в каких координатах они размещаются, к какому выразительному средству привязывается каждая переменная и подвергается ли конечной обработке.
ggplot2
ggplot(data= ДАННЫЕ,
mapping = aes( x = переменная1,
y = переменная2,
роль1 = переменная3,
роль2 = переменная4,
и т.п.)
)
) + #Обязательная часть. Чтобы добавить другие части, в конце нужно ставить плюс, который работает аналогично "трубе".
geom_ХХХХХХ( # вместо ХХХХХ указывается форма графика, например, точечный график point
aes(меняющиеся характеристики),
не меняющиеся характеристики, например colour, shape ) +
scale_ХАРАКТЕРИСТИКА ГЕОМА_ПОДХАРАКТЕРИСТИКА() + # конструирование шкалы и осей
labs(title, caption, x, y) + # заголовки и подписи
theme() + # Настройки стилей, не зависящие от значений переменных
coord_flip() + facet_wrap(~ group) # Дополнительные манипуляции
Не обязательно указывать все эти части, есть удобные умолчания.
Задача: раскрыть взаимосвязь между ростом и весом в зависимости от пола и возраста.
AT$letter.gender <- sjmisc::rec(AT$gndr, rec="1=Мужчины; 2=Женщины")
AT$weight <- as.vector(AT$weight)
AT$agea <- as.vector(AT$agea)
library(ggplot2)
g <- # сохраним в объект
ggplot(data= AT, # данные
mapping = aes( # какие переменные будут задействованы в графике
x=weight, # по оси Х
y=height, # по оси Y
colour=letter.gender, # другие характеристики графика , которые варьируют в зависимости от данных
size=agea)
)
g # посмотрим, что на этом шаге уже есть
# Добавляем формы, в систему координат
g <-
g + # берем созданную систему координат и через "+" добавляем к нему форму(ы) графика
geom_point(alpha=.2) # точечные график. В скобках - неварьирующая характеристика - прозрачность.
g
g <- g+
scale_y_continuous(breaks=seq(110,210,10)) +
scale_color_discrete(name="Гендер")+
scale_size_continuous(name="Возраст")
g
g <- g+
geom_hline(yintercept = mean(AT$height, na.rm=T), col="gray", linetype="dotted")+
annotate("text", x = 140, y = mean(AT$height, na.rm=T)-2, label="Средний рост", col="gray", size=3)+
# Подписи
labs(title = "Тяжелее ли более высокие?",
caption = "По данным ESS",
x = "Тяжесть",
y = "Высота")+
# Настройки стиля
theme( axis.line = element_line(colour = "black"),
panel.grid = element_blank(),
plot.caption = element_text(hjust=1),
plot.title = element_text(size=16, family="Times"),
plot.background = element_rect(fill="gray90"),
panel.background = element_rect(fill="gray20"),
legend.background=element_rect(fill="gray90")
)
g
ggplot(data= AT, mapping = aes(
x=weight,
y=height,
colour=letter.gender,
size=agea))+
geom_point(alpha=.2)+
scale_y_continuous(breaks=seq(110,210,10)) +
scale_color_discrete(name="Гендер")+
scale_size_continuous(name="Возраст")+
geom_hline(yintercept = mean(AT$height, na.rm=T), col="gray", linetype="dotted")+
annotate("text", x = 140, y = mean(AT$height, na.rm=T)-2, label="Средний рост", col="gray", size=3)+
# Подписи
labs(title = "Тяжелее ли более высокие?",
caption = "По данным ESS",
x = "Тяжесть",
y = "Высота")+
# Настройки стиля
theme( axis.line = element_line(colour = "black"),
panel.grid = element_blank(),
plot.caption = element_text(hjust=1),
plot.title = element_text(size=16, family="Times"),
plot.background = element_rect(fill="gray90"),
panel.background = element_rect(fill="gray20"),
legend.background=element_rect(fill="gray90")
)
Для быстрого решения без деталей
qplot(x=weight,
y=height,
colour=letter.gender,
size=agea,
alpha=.2,
geom="point",
data=AT)
library(ggiraph)
gir1 <- girafe( ggobj = ggplot(AT)+
geom_point_interactive(
aes(x = weight, # "эстетики" - то, что будет варьировать
y = height,
color = letter.gender,
size = agea,
tooltip = sport, # всплывающая подсказка (динамический контент)
data_id= sport, # переменная для использования в hover_css (см. ниже)
alpha=.4) # не варьирующая часть: прозрачность
),
width_svg = 8, height_svg = 5) # ширина и высота получаемого графика
girafe_options(x = gir1, opts_hover(css = "fill:black;stroke:orange;r:5pt;"))
par(mfrow=c(nrow, ncol))
lattice
- прямо в формуле через оператор |
ggplot2
:
+facet_grid(.~ group)
,+facet_wrap(.~group, nrow, ncol)
,gridExtra::grid.arrange()
.gganimate
https://www.youtube.com/watch?v=9Y7Y1s4-VdAЭто обобщенная функция, которая применяет разные методы в зависимости от класса объекта, перемещаемого в аргументы.
plot(weight ~ height, AT)
abline(lm(weight ~ height, AT), col="red")
library(lattice)
xyplot(weight ~ height | dom, AT)
# Более насыщенная альтернатива - скаттерплот
car::scatterplot(weight ~ height, AT)
library(lattice)
cloud(weight ~ height*agea | gndr==2, AT)
library(lattice)
levelplot(agea ~ height*weight, AT)
library(lattice)
bwplot(height ~ edulvlb | gndr, AT, horizontal=FALSE)
Баки - минимум (+1.5*ИКР от границы ящика) и максимум, ящик - 1 и 3 квартиль, медиана. Отдельные точки - редкие аутлайеры.
AT$height <- as.vector(AT$height)
histogram(AT$height)
densityplot(AT$height)
Еще один пример data story: https://ourworldindata.org/happiness-and-life-satisfaction
Hypertext Markup language Упрощенный язык разметки, позволяющий форматировать текст, добавлять гиперссылки и т.п. Основан на тегах в форме
<h2>Заголовок второго уровня</h2>
<b>Жирный шрифт</b>
<a href="https://google.com> текст ссылки </a>
Детально стили каждого из классов форматирования можно прописать с помощью CSS - cascade style sheets:
h1 {
font-family: verdana;
color: #1b0a48;
}
Еще один язык разметки текста*, но предназначенный для “бумажных” публикаций, ограниченных форматом листа. Хорошо работает с математическими формулами. Устанавливается отдельно.
* Разработчики называют его “издательской системой”
Онлайн-редактор: https://ru.overleaf.com
Упрощенный язык форматирования текста, позволяющий комбинировать его c кодом программных языков, в том числе R.
Rmarkdown - его подвид со своими небольшими особенностями.
Различные пакеты могут конвертировать RMarkdown в документы html, а также в word и pdf (с помощью LaTeX)
https://commonmark.org/help/tutorial/
# Заголовок первого уровня
## Второго
### Третьего
*Курсив*, или _курсив_
**Жирный**, __Жирный__
~~Зачеркнутый~~
![](изображение.jpg)
[текст ссылки](http://www.ссылка.com)
Просто текст[^1]
[^1]: Текст сноски
“Чанки” кода можно настраивать, что из кода и выдачи показывать
#```{r, echo=FALSE}
# код R
#
#```
# ```{python}
# myvalues = 2;
#
# ```
#
# Можно прямо в текст вставлять `r myvalues`
---
title: "Лекция 5 - Визуализация и автоматизированные отчеты"
date: "октябрь 2019"
output: # опции конвертирования кода
html_document: # конвертировать в html
css: styles1.css # таблица стилей
df_print: paged # как отображать таблицы data.frame
mathjax: null # библиотека для отображения формул
toc: yes # table of contents - добавить?
toc_depth: '2' # до какого уровня заголовки отображать?
toc_float: yes # прокручивать содержание?
collapsed: yes # свернуть содержание до первых заголовоков
code_folding: hide # свернуть исходный код в чанках?
theme: cerulean # Образцы доступных тем https://bootswatch.com
include:
after_body: footer.html # вставить дополнительный контент
---