Язык R

и его применение в биоинформатике

Лекция 3

Анна Валяева

20 сентября 2024

Пример - данные про пингвинов

Данные из пакета {palmerpenguins}.

Artwork by @allison_horst

  • в строках - наблюдения/объекты
  • в столбцах - признаки/измерения
penguins <- read_csv("data/penguins.csv")
penguins
# A tibble: 344 × 8
   species island    bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
   <chr>   <chr>              <dbl>         <dbl>             <dbl>       <dbl>
 1 Adelie  Torgersen           39.1          18.7               181        3750
 2 Adelie  Torgersen           39.5          17.4               186        3800
 3 Adelie  Torgersen           40.3          18                 195        3250
 4 Adelie  Torgersen           NA            NA                  NA          NA
 5 Adelie  Torgersen           36.7          19.3               193        3450
 6 Adelie  Torgersen           39.3          20.6               190        3650
 7 Adelie  Torgersen           38.9          17.8               181        3625
 8 Adelie  Torgersen           39.2          19.6               195        4675
 9 Adelie  Torgersen           34.1          18.1               193        3475
10 Adelie  Torgersen           42            20.2               190        4250
# ℹ 334 more rows
# ℹ 2 more variables: sex <chr>, year <dbl>

Типы данных

Количественные признаки

Типы данных

Категориальные признаки

Типы графиков

Категориальные признаки

  • Распределение наблюдений по категориям
    • Число пингвинов разных видов
    • Число самок и самцов среди пингвинов разных видов

Столбчатая диаграмма

Количественные признаки

  • Распределение одного количественного признака
    • Разброс длин крыльев пингвинов
  • Распределение одного количественного признака в разных категориях
    • Разброс длин крыльев у разных видов пингвинов

Гистограмма и график плотности

Количественные признаки

  • Распределение одного количественного признака в разных категориях
    • Разброс длин крыльев у разных видов пингвинов
    • Разброс длин крыльев у самок и самцов разных видов пингвинов

Диаграмма размаха

Количественные признаки

  • Взаимосвязь двух количественных признаков
    • Связь длины и ширины клюва у пингвинов
    • Соотношение длины крыла и массы тела пингвинов разных видов

Диаграмма разброса

Типы графиков 🏠

  • Один или несколько категориальных признаков
    • Столбчатая диаграмма
    • Круговая диаграмма
    • Диаграмма в виде плоского дерева [treemap]
    • Диаграмма Венна
    • Диаграмма UpSet
    • Потоковая диаграмма [Sankey diagram]

Как выбрать график под ваши данные

Типы графиков 🏠

  • Один количественный признак
    • Гистограмма
    • График плотности
  • Один количетвенный и один или несколько категориальных признаков
    • Диаграмма размаха
    • Скрипичная диаграмма [Violin plot]
    • Ridgeline график
  • Два или несколько количественных признаков
    • Диаграмма разброса
    • Линейная диаграмма

Как выбрать график под ваши данные

Найдите отличия…


Гистограмма

Столбчатая диаграмма

Одинаковые данные, но…


Число бинов - 5

Число бинов - 50

Ящик с усами

Ящик с усами

Показывает статистики распределения:

  • медиану (Q2)
  • нижнюю (Q1) и верхнюю (Q3) квартиль
  • межквартильный размах (IQR)
  • минимальное значение или Q1 - 1.5 × IQR
  • максимальное значение или Q3 + 1.5 × IQR
  • выбросы

Может быть по-разному в зависимости от используемого инструмента.

Ящик с усами


ggplot2 графика

ggplot2

  • свой синтаксис - грамматика графики ggplot2
  • график создается послойно
  • функции перечисляются через +
  • обязательно указать данные в виде датафрейма и переменные - названия столбцов, а также геометрическую функцию (тип графика)
# ОБЯЗАТЕЛЬНОЕ
ggplot(
  data = <DATA>,               # данные
  mapping = aes(<MAPPINGS>)) + # переменные по осям X, Y, цвет...
  <GEOM_FUNCTION>() +          # тип графика
  
# ДОПОЛНИТЕЛЬНОЕ  
  <SCALE_FUNCTION>() +         # трансформация осей
  <COORDINATE_FUNCTION>() +    # настройка системы координат
  <FACET_FUNCTION>() +         # разделение графика на панель
  <THEME_FUNCTION>()           # настройка оформления графика


Данные -> …

  • создается пустой “холст” для графика
ggplot(data = penguins)

Данные -> оси -> …

  • появляются обозначения переменных по осям X и Y
ggplot(data = penguins, 
       mapping = aes(
         x = bill_length_mm, 
         y = bill_depth_mm))

Данные -> оси -> тип графика -> …

  • появляются точки - обозначения индивидуальных наблюдений из набора данных
ggplot(data = penguins, 
       mapping = aes(
         x = bill_length_mm, 
         y = bill_depth_mm)) +
  geom_point(size = 3, alpha = 0.8)

Данные -> оси -> тип графика -> тема -> …

  • меняется оформление графика - черно-белая тема вместо серой
ggplot(data = penguins, 
       mapping = aes(
         x = bill_length_mm, 
         y = bill_depth_mm)) +
  geom_point(size = 3, alpha = 0.8) +
  theme_bw()

Оформление графика 🏠

В ggplot2 есть несколько встроенных тем для оформления графика:

  • theme_grey() - стандартная серая тема
  • theme_bw()
  • theme_classic()
  • theme_void()

Добавим цвет - еще один параметр в aes

  • добавляется обозначение разных категорий наблюдений с помощью цвета
  • используется стандартная палитра для дискретных признаков
ggplot(data = penguins, 
       mapping = aes(
         x = bill_length_mm, 
         y = bill_depth_mm,
         color = species)) +
  geom_point(size = 3, alpha = 0.8) +
  theme_bw()

Задать набор цветов 🏠

  • вручную задать цветовую палитру можно с помощью функции scale_color_manual()
ggplot(data = penguins, 
       mapping = aes(
         x = bill_length_mm, 
         y = bill_depth_mm,
         color = species)) +
  geom_point(size = 3, alpha = 0.8) + 
  scale_color_manual(
    values = c("#E2856E", "#F2B969", "#7C99A2")) +
  theme_bw()

Цветовая палитра 🏠

Цвета можно задать с помощью:

  • наименования цвета: “blue”, “red”, “purple”, …
    • все доступные в R цвета можно узнать с помощью функции color()
  • номер цвета из палитры доступных в R цветов: color()[573]
  • RGB кода и функции rgb()
    • значения R, G и B должны быть от 0 до 1: rgb(244/255, 164/255, 96/255)
  • HEX код: “#4c9be8”, “#d9534f”, “#5cb85c”, …

colors()

Показаны первые 125 цветов из 657.

Константа vs переменная

ggplot(
  penguins, 
  aes(
    x = bill_length_mm, 
    y = bill_depth_mm)) + 
  geom_point(color = "sandybrown") +
  theme_bw()

ggplot(
  penguins, 
  aes(
    x = bill_length_mm, 
    y = bill_depth_mm)) + 
  geom_point(aes(color = species)) +
  theme_bw() 

Варианты aes - aesthetics

Для разных geom_ функциий набор доступных aes разный.

Для geom_point():

  • shape - тип символа
  • color - цвет общий / цвет обводки
  • fill - заливка
  • size - размер
  • stroke - толщина обводки
  • alpha - прозрачность

aes переменные - из разных столбцов

Запишем “часть” графика в переменную

p <- ggplot(penguins, aes(x = bill_length_mm, y = bill_depth_mm)) + theme_bw() 
  
p + geom_point(size = 3, alpha = 0.8) 

Color для разных фигур 🏠

Только color, определяет цвет всей фигуры - кружочка.

p +
  geom_point(
    aes(color = species), 
    shape = 16) 

Только color, определяет цвет всей фигуры - окружности.

p + 
  geom_point(
    aes(color = species), 
    shape = 1) 

Color vs fill 🏠

И color, и fill для обводки и заливки.

p + geom_point(aes(fill = species, color = island), shape = 21) 

Цветовая шкала

Задать цвет вручную - scale_color_manual() или scale_fill_manual().

cols3 <- c("#e63946", "#ffba49", "#457b9d")
p_labels <- c("Адели", "Антарктический", "Субантарктический")

p <- p + geom_point(aes(color = species), size = 3, alpha = 0.8) +
  scale_color_manual(values = cols3, labels = p_labels) 

p

Названия осей

p <- p + 
  labs(x = "Длина клюва (мм)", y = "Высота клюва (мм)", color = "Вид")

p

Название графика

p <- p +
  labs(
    title = "Пингвиньи клювы", 
    subtitle = "У трех видов пингвинов очень разные клювики.",
    caption = "Данные: palmerpenguins")
p

Дизайн графика 🏠

Текстовые элементы - element_text()

Дизайн графика 🏠

Линии - element_line()

Дизайн графика 🏠

Границы и фон - element_rect()

Сохранение в файл

После записи в файл, проверяйте, что все сохранилось правильно. Например, размеры итоговой картинки (height и width) могут не подходить для вашего графика - все либо будет слишком мелко, либо элементы будут наезжать друг на друга.

p <- ggplot(...) + ...

ggsave("figures/my_plot.png", plot = p)

ggsave(
  "figures/my_plot.png", p, 
  dpi = 300, width = 10, height = 10, units = "cm") # dpi - разрешение картинки

# В названии файла указываете нужный формат
ggsave("figures/my_plot.pdf", p) 

Если не указать plot = p, то будет сохранен последний нарисованный/выведенный в консоль график.

Сохранение в файл

Более универсальный вариант:

pdf("figures/my_plot.pdf") # Открыть файл для записи - есть и другие функции (png, tiff, ...)
p                          # Нарисовать график
dev.off()                  # Закрыть файл


Либо сохраняйте вручную из RStudio.

В панели Plots: Export -> Save as…

Geoms 🏠

  • geom_point()
  • geom_line()
  • geom_histogram()
  • geom_boxplot()
  • geom_bar() и geom_col()
  • geom_text() и geom_label()
  • точковая диаграмма
  • линейная диаграмма
  • гистограмма
  • диаграмма разброса / боксплот
  • столбчатая диаграмма
  • текст / подписи

Гистограмма - geom_histogram()

  • нужно указать только x - количественный признак, распределение которого изучаем
  • с помощью fill (или color) можно разделить гистограмму по значениям категориальной переменной на несколько на одном графике
ggplot(penguins, aes(x = flipper_length_mm)) +
  geom_histogram(bins = 25, fill = "sandybrown") +
  labs(title = "Какой длины крылья пингвинов?", 
       x = "Длина крыла (мм)", y = "Число пингвинов") + 
  theme_bw() 

Диаграмма размаха - geom_boxplot()

  • обычно по x - значения категориальной переменной
  • по y - количественный признак, распределение которого изучаем
  • с помощью fill (или color) можно “разбить” ящики с усами по значениям второй категориальной переменной
penguins %>% drop_na(sex) %>% 
  ggplot(aes(x = species, y = flipper_length_mm, fill = sex)) +
  geom_boxplot() +
  labs(title = "Какой длины крылья пингвинов?", 
       x = "Вид", y = "Длина крыла (мм)", fill = "Пол") + 
  theme_bw() 

Порисуем!

Набор данных

Давайте посмотрим на встроенный датасет msleep.

Что он содержит?

Подробную информацию о датасете можно получить в справке: ?msleep.

Вес животных

Давайте опишем животных из этого датасета с точки зрения их веса.

  1. В каких пределах изменяется вес животных?
  2. Есть ли заметные различия по этому параметру между группами животных с разным типом питания?

Взаимосвязь веса животных и длительности сна

  1. Наблюдается ли взаимосвязь между весом животных и общей длительностью их сна?

Конец!