# --- Пакеты ------------------------------------------------------------------------------- # В правой нижней панели во вкладке Packages # вы можете првоерить какие из пакетов установлены # Установите необходимое library(tidyverse) # обработка и визуализация данных library(dplyr) # мвнипуляции с данными library(readxl) # работа с данными в формате Excel library(DescTools) # для описательной статистики library(ggplot2) # создание графиков library(ggthemes) # темы графиков и настройки визуализации # Кроме основного пакета ggplot2 существует еще очень большое количество его расширений, # которые наследуют общие принципы, но добавляют новые геометрии, темы, # дополнительные возможности для графиков и прочее. Перечень этих расширений можно посмотреть [здесь](https://exts.ggplot2.tidyverse.org/). # --- Загрузка данных ---------------------- df <- read.csv("dataset.csv") ### О наборе данных # Набор данных о 79 пациентах, имеющих основное заболевание m, t или h # - id - идентификационный номер пациента # - sex - пол пациента # - age - возраст пациента # - weight - вес пациента # - heigt - рост пациента # - bmi - ИМТ пациента # - gr - основной диагноз - закодирован: m, t или h # - ag - наличие артериальной гипертензии # - sd - наличие сахарного диабета # - im - наличие инфаркта миокарда в анамнезе # - lab1 - первый лабораторный показатель крови # - lab2 - второй лабораторный показатель крови # Перекодируем признаки в факторные переменные df <- df %>% mutate(across(c( sex, gr, ag, sd, im),as.factor)) # Удалим пропуски в данных и спомощью функции summary() проверим результат df <- na.omit(df) # Создадим простой график, указав датасет для построений, переменные, которые мы хотим отобразить. # и тип геометрии - диаграммы рассеяния это `geom_point` ggplot(df)+ geom_point(aes(x=age,y=bmi)) # Для каждого типа геометрии `geom_` есть несколько настроек эстетики `aes`, часть из которых обязательна, # то есть без их указания график строится не будет. # Для точек `geom_point` обязательными являются x и y. # Если их не указать, то функция выдаст ошибку `Error: geom_point requires the following missing aesthetics: x and y` ### Тип символа # Попробуем модифицировать график. Изменим размер и форму точек. ggplot(df)+ geom_point(aes(x=age,y=bmi), size=3, shape="diamond") # Тип символа можно также задать на основе переменной, например, # в нашем случае в зависимости от типа основного заболевания ggplot(df)+ geom_point(aes(x=age,y=bmi,shape=gr), size=3) ### Цвета и цветовые шкалы # Цвет точек на графике можно задать различными способами: просто указать цвет или указать цвет на основе какой-то характеристики. #задание цвета описательно ggplot(df)+ geom_point(aes(x=age,y=bmi), color="navy") #задание цвета через 16-тиричное кодирование ggplot(df)+ geom_point(aes(x=age,y=bmi), color="#ec3713") # Добавим цвета точек в зависимости от переменной # Основной диагноз - это качественная переменная. Эту цветовую шкалу можно далее модифицировать по необходимости. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894")) # Либо использовать существующую цветовую шкалу. Например, на основе [ColorBrewer палитр](http://colorbrewer2.org/). # Для этого необходим пакет `RColorBrewer`. Можно посмотреть все цифровые палитры: library(RColorBrewer) display.brewer.all() #Для использования палитр в графиках нужна функция `scale_*_brewer()` if(!require(RColorBrewer)) {install.packages("RColorBrewer") require(RColorBrewer)} ggplot(df)+ geom_point(aes(x=age,y=bmi, color=ag))+ scale_color_brewer(palette = "Set2") ### Темы оформления # Все предыдущие графики были построены с использованием темы по умолчанию, которую можно поменять на одну из встроенных тем # или добавить тему оформления из пакета-расширения, а также модифицировать на свое усмотрение # Замена темы оформления на одну из встроенных. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw() # Воспользуемся темой оформления из пакета `ggthemes`. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_economist() # Кроме использования существующих тем, можно отдельные элементы настраивать по желанию с помощью функции `theme`. # Все возможные компоненты можно посмотреть в документации [здесь](https://ggplot2.tidyverse.org/reference/theme.html) ### Названия и подписи осей графика # Добавим названия осей ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела") # Либо названия осей могут быть заданы отдельно функциями `xlab()` и `ylab()`. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ xlab("Возраст")+ ylab("Индекс массы тела") # Как уже было сказано выше отдельные элементы оформления могут быть модифицированы функцией `theme`. # Изменим расположение названий осей и размер. Так как здесь будут меняться параметры текста, # то необходимо использовать функцию `element_text()`. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ theme(axis.title.x = element_text(vjust = 0, #выравнивание по вертикали (от 0 до 1) size = 15), axis.title.y = element_text(vjust = 2, size = 15)) # Также расположение названий можно изменить указав отступы. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ theme(axis.title.x = element_text(margin = margin(t=20), size = 15), axis.title.y = element_text(margin = margin(r=10), size = 15)) ### Система координат # Кроме названий осей и подписей систему координат можно менять (например, с прямоугольной на полярную), # изменять диапазон осей (если необходимо показать какой-то фрагмент крупнее), поменять соотношение осей. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ scale_x_continuous(limits=c(0,100))+ scale_y_continuous(limits=c(20,40)) # Можно настроить соотношение осей. Функция `coord_fixed()` - задает систему координат с определенным соотношением между осями, по умолчанию это соотношение 1. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ coord_fixed() # Если это соотношение сделать больше единицы, то размерность по оси y увеличится по отношению к размерности по оси x и наоборот. ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ coord_fixed(ratio = 4) ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ coord_fixed(ratio = 1/2) # Шаг сетки координат можно задать вручную ggplot(df)+ geom_point(aes(x=age,y=bmi, color=gr))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ scale_x_continuous(breaks = seq(30, 60, 10), minor_breaks = seq(30, 60, 1))+ scale_y_continuous(breaks = seq(10, 25, 5), minor_breaks = seq(10, 25, 0.2)) ### Заголовки # Заголовок можно добавить функцией `ggtitle()` ggplot(df)+ geom_point(aes(x=age,y=bmi, color=ag))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела")+ ggtitle("Данные о пациентах") # Или прописать как дополнительные аргументы в функции `labs()` ggplot(df)+ geom_point(aes(x=age,y=bmi, color=ag))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела", title = "Данные о пациентах", #основной заголовок subtitle = "Данные собраны данные собраны на основании опросов", #подзаголовок caption = "Опрос", #текст в правом нижнем углу tag = "Рис. 1") #текст в левом верхнем углу ### Легенда # Легенда графика, как правило, создается по умолчанию и расположена справа от графика. Заголовок легенды по умолчанию - это переменная, # по которой задана эстетика (aes), в нашем случае это gr или ag. # Если легенда не нужна, то ее можно убрать с графика либо theme(legend.position = "none"), либо guides(color = "none"), # либо scale_color_manual(guide="none"). ggplot(df)+ geom_point(aes(x=age,y=bmi, color=ag))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела", title = "Данные о пациентах")+ #основной заголовок theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5), plot.subtitle = element_text(face = "italic", size = 10,hjust = 0.5), plot.title.position = "plot", legend.position = "none") # Заменим названия внутри легенды. Это можно сделать аргументом labels внутри функции scale_color_manual() ggplot(df)+ geom_point(aes(x=age,y=bmi, color=ag))+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"), labels=c("есть","отсутствует"))+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела", color="Наличие артериальной гипертензии", #Изменили заголовок в легенде title = "Данные о пациентах")+ #основной заголовок theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5), plot.subtitle = element_text(face = "italic", size = 10,hjust = 0.5), plot.title.position = "plot")+ guides(color = guide_legend(override.aes = list(size = 4))) # увеличили раззмер точек в легенде ## Пузырьковая диаграмма (bubble plot) # Это разновидность диаграммы рассеяния или точечной диаграммы. # Главная разница в том, что размер точки зависит от величины переменной. # Параметры графика такие же, как и у диаграммы рассеяния ggplot(df,aes(x=age,y=bmi, color=gr))+ geom_point(aes(size=weight),alpha=0.4)+ scale_color_manual(values = c("#19a6b3","#f26c0d","#5e3894"), labels=c("h","m","t"))+ scale_size(range = c(.2,5), guide = guide_legend())+ theme_bw()+ labs(x="Возраст",y="Индекс массы тела", color="Основное заболевание", #Изменили заголовок в легенде title = "Данные о пациентах")+ #основной заголовок theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5), plot.subtitle = element_text(face = "italic", size = 10,hjust = 0.5), plot.title.position = "plot") ------------------------------------------------------------------------ ### Столбчатая диаграмма (bar plot) # # Для того, чтобы создать столбчатую диаграмму в `ggplot2` есть две функции: `geom_bar()` и `geom_col()`. # Главная разница между ними в том, что в `geom_bar()` высота столбцов пропорционально количеству наблюдений в группе # или (если указаны веса) сумму весов. # Тогда как в `geom_col()` высота столбцов пропорциональна величине характеристики. # # Для функции `geom_bar()` обязательным параметром эстетики является одна из координат x или y summary(df) ggplot(df)+ geom_bar(aes(x=gr,fill=gr))+ scale_fill_manual(values = c("#19a6b3","#f26c0d","#5e3894"), labels=c("h","m","t"))+ theme_bw()+ labs(x="",y="", fill="Код основного заболевания", title = "Количество")+ #основной заголовок theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5), plot.subtitle = element_text(face = "italic", size = 10,hjust = 0.5), plot.title.position = "plot") # Рассмотрим вторую функцию для построения столбчатых диаграмм `geom_col()` ggplot(df)+ geom_col(aes(x=id,y=weight,fill=gr))+ scale_fill_manual(values = c("#19a6b3","#f26c0d","#5e3894"), labels=c("h","m","t"))+ theme_bw()+ labs(x="",y="Вес", fill="Код основного заболевания", title = "Вес пациентов") + theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5), plot.subtitle = element_text(face = "italic", size = 10,hjust = 0.5), plot.title.position = "plot") #### Графики распределения ## Гистограмма (histogram) # # Для построения гистограммы распределения величины существует функция `geom_histogram()`, # в которой обязательной характеристикой является x или y (в зависимости от того, относительно какой оси вы хотите построить гистрограмму) ggplot(df)+ geom_histogram(aes(x=age,fill=gr),alpha=0.5)+ scale_fill_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(title = "Гистограмма распределения возраста", x="Возраст", y=NULL, fill="код основного заболевания")+ theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5)) ## График плотности распределения (density plot) #Для отрисовки функции плотности распределения величины применяется `geom_density()` ggplot(df)+ geom_density(aes(x=bmi,fill=gr), alpha=0.5,color=NA)+ scale_fill_manual(values = c("#19a6b3","#f26c0d","#5e3894"))+ theme_bw()+ labs(x="Индекс массы тела", y=NULL, fill="код основного заболевания", title="График плотности распределения")+ theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5)) # Распределение категориальных переменных обычно визуализируют с помощью графика ящик с усами(boxplot) ggplot(df)+ geom_boxplot(aes(y=bmi,fill=gr),alpha=0.5)+ scale_fill_manual(values = c("#19a6b3","#f26c0d","#5e3894"),name=NULL)+ theme_bw()+ labs(y="Индекс массы тела",y=NULL,title = "Ящик с усами")+ theme(plot.title = element_text(face = "bold",size = 20,hjust = 0.5))