chr_variable[1] "ФББ МГУ"
typeof(chr_variable)[1] "character"
Пакеты {stringr} и {ggplot2}
Тип строка (character, chr) может хранить как один или несколько символов, одно слово, так и целые предложения или абзацы текста. Чтобы понять, что перед вами строка, можно обратить внимание на кавычки или переспросить у R тип данных с помощью функции typeof().
chr_variable[1] "ФББ МГУ"
typeof(chr_variable)[1] "character"
Чтобы создать строку, необходимо заключить слово (набор символов) в кавычки - без разницы одинарные или двойные. Если строка должна содержать кавычки, то нужно использовать разные кавычки для обозначения строки и внутри строки.
"Курс для студентов ФББ 'Язык R и его применение в биоинформатике'"[1] "Курс для студентов ФББ 'Язык R и его применение в биоинформатике'"
Также можно преобразовать другой тип данных в строки с помощью функции as.character().
as.character(c(F, T, T))[1] "FALSE" "TRUE" "TRUE"
Чаще всего мы все же будем работать с наборами данных, собранных в виде таблиц - датафреймов. В них некоторые столбцы могут быть строковыми. Это можно заметить по подписи <chr> под названием столбца, если вы работаете с тибблом. Также строковые столбцы можно отобрать с помощью конструкции where(is.character()). Такие столбцы обычно содержат значения категориальных признаков или комментарии к конкретным записям.
starwars %>% select(where(is.character))# A tibble: 87 × 8
name hair_color skin_color eye_color sex gender homeworld species
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Luke Skywalker blond fair blue male mascu… Tatooine Human
2 C-3PO <NA> gold yellow none mascu… Tatooine Droid
3 R2-D2 <NA> white, bl… red none mascu… Naboo Droid
4 Darth Vader none white yellow male mascu… Tatooine Human
5 Leia Organa brown light brown fema… femin… Alderaan Human
6 Owen Lars brown, gr… light blue male mascu… Tatooine Human
7 Beru Whitesun… brown light blue fema… femin… Tatooine Human
8 R5-D4 <NA> white, red red none mascu… Tatooine Droid
9 Biggs Darklig… black light brown male mascu… Tatooine Human
10 Obi-Wan Kenobi auburn, w… fair blue-gray male mascu… Stewjon Human
# ℹ 77 more rows
Для работы со строками (поиск слова в строке, замена символов и т.д.) есть набор функций в “базовом” R, но пакет {stringr} из коллекции tidyverse предоставляет более удобный функционал. Чтобы иметь возможность работать с этим пакетом, достаточно установить (что у вас уже должно быть сделано) и подгрузить пакет {tidyverse} - library(tidyverse). Либо можно подгрузить только {stringr} без других tidyverse-пакетов (но они обычно пригождаются) - library(stringr).
library(tidyverse)Практически все функции из пакета {stringr} начинаются со str_. После ввода этих символов в RStudio появляется окошко-подсказка со списком доступных функций - это очень удобно, ведь просто по названию функции можно легко понять или вспомнить, что эта функция делает, и быстро найти нужный вариант.
Далее рассмотрим несколько функций из пакета {stringr}. Список всех функций этого пакета можно получить с помощью команды help(package = stringr).
Будем работать с датафреймом starwars (набор данных из одного из пакетов tidyverse) и с вектором с названиями дней недели, который создадим сами:
weekdays <- c("Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", "Sunday")
weekdays[1] "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday"
[7] "Sunday"
Для изменения регистра букв в строках в {stringr} есть функции str_to_lower(), str_to_upper(), str_to_sentence() и str_to_title(). Первые две из них дублируют функции tolower() и toupper() из “базового” R.
str_to_title(chr_variable)[1] "Фбб Мгу"
Длину строки (число символов в строке) можно получить с помощью функции str_length().
str_length(weekdays)[1] 6 7 9 8 6 8 6
Важно осознать, что все функции из {stringr} можно применять не только к векторам, но и к строковым столбцам в датафремах, а именно использовать в сочетании с функциями из {dplyr} (например, mutate() или filter()) и в конвейерах.
starwars %>%
transmute(name, name_length = str_length(name))# A tibble: 87 × 2
name name_length
<chr> <int>
1 Luke Skywalker 14
2 C-3PO 5
3 R2-D2 5
4 Darth Vader 11
5 Leia Organa 11
6 Owen Lars 9
7 Beru Whitesun Lars 18
8 R5-D4 5
9 Biggs Darklighter 17
10 Obi-Wan Kenobi 14
# ℹ 77 more rows
В пакете {stringr} есть несколько функций, которые осуществляют поиск заданного слова (или шаблона) в строке.
str_detect() проверяет, содержит ли строка слово/шаблон и возвращает логический вектор.str_detect(weekdays, "Sun") # содержит Sun[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE
str_which() проверяет, содержит ли строка слово/шаблон и возвращает вектор с индексами строк, в которых совпадение нашлось.str_which(weekdays, "Sun") # содержит Sun[1] 7
str_count() позволяет подсчитать число обнаруженных совпадений в строке.str_remove() и str_remove_all() удаляют символы из строки по шаблону.str_replace() и str_replace_all() заменяют символы в строке по шаблону.str_extract() и str_extract_all() возвращают найденное слово/шаблон в каждой строке.str_subset() возвращает строки, содержащие слово/шаблон.Функции str_remove() и str_remove_all() (и подобные им) различаются тем, что либо работают только с первым совпадением в строке, либо работают со всеми совпадениями.
Перечисленные выше функции для поиска слов в строке работают и с регулярными выражениями. Подробнее про то, как составлять регулярные выражения в R, можно посмотреть в cheat sheet по пакету {stringr}.
Например, символы ^ и $ задают начало и конец строки, соответственно.
str_detect(weekdays,"^S") # начинается на S[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE
str_count(weekdays, "[aeiou]") # подсчитать все гласные[1] 2 3 3 2 2 3 2
При работе со специальными символами нужно их экранировать.
str_count(c("what?", "when??", "how?!!"), "?")Error in `stri_count_regex()`:
! Syntax error in regex pattern. (U_REGEX_RULE_SYNTAX, context=`?`)
str_count(c("what?", "when??", "how?!!"), "\\?")[1] 1 2 1
Кроме того, функционал {stringr} позволяет визуализировать регулярные выражения в вашем датасете с помощью функции str_view_all().
str_view_all(weekdays, "[aeiou]")[1] │ M<o>nd<a>y
[2] │ T<u><e>sd<a>y
[3] │ W<e>dn<e>sd<a>y
[4] │ Th<u>rsd<a>y
[5] │ Fr<i>d<a>y
[6] │ S<a>t<u>rd<a>y
[7] │ S<u>nd<a>y
Функция str_split() позволяет разбить строку на несколько по указанному разделителю или шаблону. Результат выдается в виде списка.
starwars %>%
head() %>%
mutate(
hair_color_splitted = str_split(hair_color, ", ")) %>%
pull(hair_color_splitted)[[1]]
[1] "blond"
[[2]]
[1] NA
[[3]]
[1] NA
[[4]]
[1] "none"
[[5]]
[1] "brown"
[[6]]
[1] "brown" "grey"
Функция str_wrap() позволяет заменять некоторые пробелы с строках из нескольких слов на символы переноса строки \n. Эта функция может пригодиться при добавлении на график длинного текста, который в виде единой строки не поместился бы в границы графика.
str_wrap("Курс для студентов ФББ 'Язык R и его применение в биоинформатике'", width = 20)[1] "Курс для студентов\nФББ 'Язык R и\nего применение в\nбиоинформатике'"
Список всех функций пакета {stringr}: help(package = stringr)
Возьмите встроенный набор данных - fruit.
aeiou). Используйте функции str_remove() и str_remove_all(). Сравните результаты.berry.В ходе некоторого анализа был получен список (вектор) из очень важных функциональных категорий генов - они закодированы с помощью идентификаторов. Однако в векторе оказались смешаны идентификаторы из разных баз данных - Gene Ontology (начинаются на GO:) и KEGG (начинаются на hsa в случае человеческих генов).
gene_cat <- c("GO:1902222", "hsa00380", "hsa00630", "GO:0006559", "GO:0042773", "hsa00350", "hsa00730", "GO:0051792", "GO:0006572", "GO:0006573", "GO:0032324", "GO:0006390", "GO:0009250", "hsa01212", "GO:0005978")Из абстрактов молекулярно-биологических статей можно понять, о каких генах преимущественно идет речь в статье. Для каждого из абстрактов вычлените названия генов, которые в них упоминаются. Названия генов, которые мы ищем, содержат все заглавные буквы и цифры и длиной не короче 3 символов.
abstracts <- c(
"Atherosclerosis (AS) is one of the main causes of cardiovascular diseases (CVDs). Trimethylamine N-oxide (TMAO) exacerbates the development of AS. This study aimed to investigate the roles of TMAO in AS. In this study, mice were fed with high fat food (HF) and/or injected with TMAO. Oil red O staining was applied for histological analysis. ELISA, qRT-PCR, and western blot were conducted to determine the TMAO, serum, mRNA, and protein levels. CCK-8, colony formation assay, and flow cytometry assays were performed to detect the functions of human aortic endothelial cells (HUVECs). The results showed that TMAO induced thick internal and external walls and intimal plaques in vivo, and HUVECs dysfunction in vitro. TMAO and lncRNA enriched abundant transcript 1 (NEAT1) were increased in AS clinical samples and TMAO-HUVECs. Downregulated NEAT1 inhibited proliferation and promoted the apoptosis of HUVECs. NEAT1 regulated the expression of signal transducer and activator of transcription 3 (STAT3) via sponging miR-370-3p. Overexpression of miR-370-3p facilitated the effects of NEAT1 on the cellular functions of HUVECs, while STAT3 exerted opposing effects. The activation of STAT3 promoted the expression of flavin-containing monooxygenase-3 (FMO3). Taken together, our results show that TMAO-NEAT1/miR-370-3p/STAT3/FMO3 forms a positive feedback loop to exacerbate the development of AS. This novel feedback loop may be a promising therapeutic target for AS.",
"RNA G-quadruplexes (rG4s) have functional roles in many cellular processes in diverse organisms. While a number of rG4 examples have been reported in coding messenger RNAs (mRNA), so far only limited works have studied rG4s in non-coding RNAs (ncRNAs), especially in long non-coding RNAs (lncRNAs) that are of emerging interest and significance in biology. Herein, we report that MALAT1 lncRNA contains conserved rG4 motifs, forming thermostable rG4 structures with parallel topology. We also show that rG4s in MALAT1 lncRNA can interact with NONO protein with high specificity and affinity in vitro and in nuclear cell lysate, and we provide cellular data to support that NONO protein recognizes MALAT1 lncRNA via rG4 motifs. Notably, we demonstrate that rG4s in MALAT1 lncRNA can be targeted by the rG4-specific small molecule, peptide, and L-aptamer, leading to the dissociation of MALAT1 rG4-NONO protein interaction. Altogether, this study uncovers new and important rG4s in MALAT1 lncRNAs, reveals their specific interactions with NONO protein, offers multiple strategies for targeting MALAT1 and its RNA-protein complex via its rG4 structure and illustrates the prevalence and significance of rG4s in ncRNAs.",
"Automated and accurate EGFR mutation status prediction using computed tomography (CT) imagery is of great value for tailoring optimal treatments to non-small cell lung cancer (NSCLC) patients. However, existing deep learning based methods usually adopt a single task learning strategy to design and train EGFR mutation status prediction models with limited training data, which may be insufficient to learn distinguishable representations for promoting prediction performance. In this paper, a novel multi-task learning method named AIR-Net is proposed to precisely predict EGFR mutation status on CT images. First, an auxiliary image reconstruction task is effectively integrated with EGFR mutation status prediction, aiming at providing extra supervision at the training phase. Particularly, we adequately employ multi-level information in a shared encoder to generate more comprehensive representations of tumors. Second, a powerful feature consistency loss is further introduced to constrain semantic consistency of original and reconstructed images, which contributes to enhanced image reconstruction and offers more effective regularization to AIR-Net during training. Performance analysis of AIR-Net indicates that auxiliary image reconstruction plays an essential role in identifying EGFR mutation status. Furthermore, extensive experimental results demonstrate that our method achieves favorable performance against other competitive prediction methods. All the results executed in this study suggest that the effectiveness and superiority of AIR-Net in precisely predicting EGFR mutation status of NSCLC.",
"Driver mutations promote initiation and progression of cancer. Pharmacological treatment can inhibit the action of the mutant protein; however, drug resistance almost invariably emerges. Multiple studies revealed that cancer drug resistance is based upon a plethora of distinct mechanisms. Drug resistance mutations can occur in the same protein or in different proteins; as well as in the same pathway or in parallel pathways, bypassing the intercepted signaling. The dilemma that the clinical oncologist is facing is that not all the genomic alterations as well as alterations in the tumor microenvironment that facilitate cancer cell proliferation are known, and neither are the alterations that are likely to promote metastasis. For example, the common KRasG12C driver mutation emerges in different cancers. Most occur in NSCLC, but some occur, albeit to a lower extent, in colorectal cancer and pancreatic ductal carcinoma. The responses to KRasG12C inhibitors are variable and fall into three categories, (i) new point mutations in KRas, or multiple copies of KRAS G12C which lead to higher expression level of the mutant protein; (ii) mutations in genes other than KRAS; (iii) original cancer transitioning to other cancer(s). Resistance to adagrasib, an experimental antitumor agent exerting its cytotoxic effect as a covalent inhibitor of the G12C KRas, indicated that half of the cases present multiple KRas mutations as well as allele amplification. Redundant or parallel pathways included MET amplification; emerging driver mutations in NRAS, BRAF, MAP2K1, and RET; gene fusion events in ALK, RET, BRAF, RAF1, and FGFR3; and loss-of-function mutations in NF1 and PTEN tumor suppressors. In the current review we discuss the molecular mechanisms underlying drug resistance while focusing on those emerging to common targeted cancer drivers. We also address questions of why cancers with a common driver mutation are unlikely to evolve a common drug resistance mechanism, and whether one can predict the likely mechanisms that the tumor cell may develop. These vastly important and tantalizing questions in drug discovery, and broadly in precision medicine, are the focus of our present review. We end with our perspective, which calls for target combinations to be selected and prioritized with the help of the emerging massive compute power which enables artificial intelligence, and the increased gathering of data to overcome its insatiable needs."
)Прочитайте датасет с репликами героев первых пяти серий первого сезона “Ведьмака”, датасет доступен по ссылке https://raw.githubusercontent.com/kirushka/datasets/main/witcher.csv. Ссылку можно использовать как путь до файла при чтении датасета в R.
Посмотрите и изучите как он выглядит и что содержит.
witcher <- read_csv("https://raw.githubusercontent.com/kirushka/datasets/main/witcher.csv")
glimpse(witcher)Rows: 1,478
Columns: 2
$ Character <chr> "Isadora", "Geralt", "Isadora", "Inkeeper", "Geralt", "Nohor…
$ Text <chr> "What will it be?", "Point me to the alderman's house.", "It…
В ggplot-графике используется особый синтаксис (the layered grammar of graphics): элементы, определяющие график, добавляются на рисунок послойно. Слои графика, определяемые функциями {ggplot2} (и из совместимых пакетов), соединяются в единый объект с помощью знаков сложения +.
# ОБЯЗАТЕЛЬНОЕ
ggplot(
data = <DATA>, # данные в виде датафрейма/тиббла
mapping = aes(<MAPPINGS>)) + # переменные по осям X, Y, цвет...
<GEOM_FUNCTION>() + # тип графика
# ДОПОЛНИТЕЛЬНОЕ
<SCALE_FUNCTION>() + # трансформация осей
<COORDINATE_FUNCTION>() + # настройка системы координат
<FACET_FUNCTION>() + # разделение графика на панель
<THEME_FUNCTION>() # настройка оформления графикаДавайте построим диаграмму рассеяния, или точковую диаграмму, которая бы показывала взаимосвязь между длиной и высотой клюва пингвинов нескольких видов. В качестве источника этих данных возьмем набор данных penguins (это встоенный набор данных, начиная с версии R 4.5.0; если у вас версия R старше, то можно прочитать этот набор данных, например, по этой ссылке - https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-04-15/penguins.csv).
head(penguins, 5) species island bill_len bill_dep flipper_len body_mass sex year
1 Adelie Torgersen 39.1 18.7 181 3750 male 2007
2 Adelie Torgersen 39.5 17.4 186 3800 female 2007
3 Adelie Torgersen 40.3 18.0 195 3250 female 2007
4 Adelie Torgersen NA NA NA NA <NA> 2007
5 Adelie Torgersen 36.7 19.3 193 3450 female 2007
В этом наборе данных содержится информация о пингвинах 3-х видов (столбец species): Адели (Adelie), Антарктическом (Chinstrap) и Субантарктическом (Gentoo). В таблице есть информация о том, на каком острове они проживают (island), а также о длине (bill_len) и высоте их клювов (bill_dep), длине крыла (flipper_len), массе тела (body_mass), поле (sex) и в каком году было проведена поимка каждого пингвина (year).
Создание каждого графика начинается с функции ggplot(). Эта функция инициализирует график - “создает холст”, на который будут добавляться элементы графика.
ggplot()Первый агрумент, который принимает функция ggplot() на вход, - это data, то есть датафрейм или тиббл, содержащий данные, которые планируется изобразить на графике. При написании кода название этого первого параметра можно не прописывать, а опираться на то, что первый указанный для функции ggplot() аргумент всегда будет восприниматься как датафрейм/тиббл с данными.
ggplot(data = penguins)ggplot(penguins)После того, как определились с данными, разумно задуматься о том, что планируется откладывать по осям - какой признак хочется изобразить по оси X, какой - по оси Y. Это можно сделать с помощью второго параметра функции ggplot() - mapping. Чтобы указать, что по оси X мы хотим отложить значения длины клюва (значения из столбца bill_len), а по оси Y - значения высоты клюва (столбец bill_dep), нужно воспользоваться функцией aes() для задания этих графических переменных.
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep))На этом этапе появились подписи по осям - названия столбцов, которые мы указали в качестве графических переменных (функция aes()), и сетка графика с опорными значениями, но мы всё ещё не получили диаграмму рассеяния, потому что не указали с помощью геометрической функции, что мы желаем отрисовать график именно такого типа.
Диаграмма рассеяния состоит из точек, каждая из которых представляет собой индивидуальное наблюдение (в случае набора данных про пингвинов - конкретного пингвина), поэтому этот тип графика будет определяться использованием геометрической функции geom_point(), которая рисует точки (или, как увидим далее, другие символы). С помощью параметров size и alpha можно настроить размер и прозрачность точек.
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep)) +
geom_point(size = 3, alpha = 0.8)С помощью цвета в диаграмме рассеяния и других типах визуализации можно закодировать значения дополнительных как количественных, так и категориальных признаков, таким образом добавив еще одну “ось” на график. Например, мы можем добавить информацию о принадлежности каждого пингвина к конкретному виду. Поскольку цвет каждой точки должен соотвествовать значению в столбце species, добавляем параметр color как еще одну графическую переменную в функции aes().
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep, color = species)) +
geom_point(size = 3, alpha = 0.8)По умолчанию в графике будет использоваться стандартная для {ggplot2} цветовая палитра. Задать же цвета вручную можно с помощью функции scale_color_manual() (о функция типа scale_ чуть подробнее написано ниже). Здесь цвета заданы с помощью HEX-кодов, о других вариантах будет рассказано дальше.
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep, color = species)) +
geom_point(size = 3, alpha = 0.8) +
scale_color_manual(values = c("#e63946", "#ffba49", "#457b9d"))Чтобы изменить названия осей или легенды можно воспользоваться функцией labs(). В зависимости от того, какие графические переменные были использованы при построении графика, так и будут называться параметры для изменения названий легенд. Эта же функция позволяет добавить заголовок графика (параметр title), а также подзаголовок (subtitle) и подпись (caption).
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep, color = species)) +
geom_point(size = 3, alpha = 0.8) +
scale_color_manual(values = c("#e63946", "#ffba49", "#457b9d")) +
labs(
x = "Длина клюва (мм)",
y = "Высота клюва (мм)",
color = "Вид",
title = "Пингвиньи клювы")По умолчанию в ggplot2-графиках используется серая тема (theme_grey(), или theme_gray()), которая определяет, например, то, что фон графика будет серым. Однако не всегда такой серый фон будет сочетаться с оформлением работ, в которых вы будете использовать эти графики, например, в постере или тексте курсовой работы. Поэтому вам рекомендуется ознакомиться с другими функциями theme_ для выбора готовых вариантов оформления графика, например:
theme_grey(), или theme_gray() - стандартная серая темаtheme_bw()theme_classic()theme_void()theme_ и опробуйте все варианты 🙃Чтобы самостоятельно настроить вид различных элементов дизайна графика, например, размер и положение заголовка или цвет линий сетки графика, необходимо воспользовать функцией theme(). О принципах работы с этой функцией будет рассказано дальше.
Далее во всех графиках этого документа будет скрыто использоваться theme_minimal().
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep, color = species)) +
geom_point(size = 3, alpha = 0.8) +
scale_color_manual(values = c("#e63946", "#ffba49", "#457b9d")) +
labs(
x = "Длина клюва (мм)",
y = "Высота клюва (мм)",
color = "Вид",
title = "Пингвиньи клювы") +
theme_minimal()Последовательность использования ggplot2-функций при создании графика обычно не важна, но может играть роль при создании сложных визуализаций, например, комбинирующих несколько типов графиков. Тем не менее, создание графика всегда начинается с функции ggplot(), инициализирующей “холст” графика.
При вызове функции ggplot() удобно сразу указать датафрейм - источник данных, которые мы визуализируем, и задать графические переменные (“что по осям?”) с помощью функции aes(). В таком случае все функции, используемые для построения вашего графика, будут обращаться к указанному источнику данных и заданным графическим переменным. Однако у геометрических функций есть свои параметры data = и mapping =, поэтому один и тот же график можно создать с помощью немного отличающегося кода или при создании сложного графика отдельно настроить работу разных слоев графика.
Стоит отметить, что {ggplot2} также отлично сочетается с конвейерным подходом.
Например, показанный ниже график плотности можно создать, записав код немного по-разному:
ggplot(starwars, aes(x = height)) +
geom_density(fill = "yellowgreen")
# используя конвейер
starwars %>%
ggplot(aes(x = height)) +
geom_density(fill = "yellowgreen")
# вынеся aes отдельным "слоем"
starwars %>%
ggplot() +
aes(x = height) +
geom_density(fill = "yellowgreen")
# указав aes отдельно для geom_point
starwars %>%
ggplot() +
geom_density(aes(x = height), fill = "yellowgreen")
# указав data и aes отдельно для geom_point
ggplot() +
geom_density(aes(x = height), data = starwars, fill = "yellowgreen")Для создания разных типов визуализаций существует набор геометрических функций geom_:
geom_point()geom_line()geom_histogram()geom_density()geom_boxplot()geom_bar() и geom_col()geom_text() и geom_label()Также существуют дополнительные пакеты, совместимые с {ggplot2}, предоставляющие различные варианты других геометрических функций, с помощью которых можно строить более сложные и вычурные графики.
Гистограмма используется для визуализации распределения одного количественного признака. При написании кода обязательно указать только одну графическую переменную - x, тогда по оси X будут отложены значения того количественного признака, распределение которого изучаем. Дополнительно можно с помощью fill (или color) разделить гистограмму по значениям категориальной переменной на несколько на одном графике.
ggplot(penguins, aes(x = flipper_len)) +
geom_histogram(bins = 25, fill = "sandybrown") +
labs(
title = "Какой длины крылья пингвинов?",
x = "Длина крыла (мм)", y = "Число пингвинов") С помощью “ящиков с усами” удобно сравнивать распределения одного количественного признака между несколькими группами наблюдений, например, распределения длин крыльев у разных видов пингвинов. При создании боксплота по x обычно указываются значения категориальной переменной, по y - количественный признак, распределение которого изучаем. С помощью fill (или color) можно “разбить” ящики с усами по значениям второй категориальной переменной.
penguins %>% drop_na(sex) %>%
ggplot(aes(x = species, y = flipper_len, fill = sex)) +
geom_boxplot() +
scale_fill_manual(values = c("#ffba49", "#a8dadc")) +
labs(
title = "Какой длины крылья пингвинов?",
x = "Вид", y = "Длина крыла (мм)", fill = "Пол") Создавая график, можно использовать несколько геометрических функций (geom_), чтобы комбинировать типы графиков. В таком случае порядок записи геометрических функций может оказаться важен, поскольку добавляемые geom’ы, будут отрисовываться поверх предыдущих.
starwars %>%
filter(homeworld %in% c("Naboo", "Tatooine")) %>%
ggplot(aes(x = homeworld, y = height, fill = homeworld)) +
geom_violin(alpha = 0.6) +
geom_boxplot(width = 0.4) +
geom_jitter(width = 0.05) +
scale_fill_manual(values = c("skyblue", "khaki"))starwars только персонажей с планет Набу и Татуин
geom_jitter - аналог geom_point, но рисует точки с некоторым разбросом)
Геометрические функции отличаются наборами графических переменных, посредством которых можно закодировать значения признаков из вашего датасета. В первую очередь вы будете использовать x и/или y, чтобы отложить выбранные признаки по осями. Также для большинства отрисовываемых геометрических объектов можно задать цвет с помощью color (задать константный цвет или задать соответствие между значением и цветом в палитре). Некоторые геометрические объекты (например, столбцы гистограммы или столбчатой диаграммы, а также символы под номерами 21-25, которые можно отрисовать с помощью geom_point()) обладают как внутренней заливкой, так и внешней обводкой. В таком случае для заливки используется fill, для обводки color.
starwars %>%
filter(homeworld %in% c("Naboo", "Tatooine")) %>%
ggplot(aes(x = mass, fill = homeworld)) +
geom_density(alpha = 0.6, color = "yellowgreen")starwars только персонажей с планет Набу и Татуин
fill) кодируем родную планету
alpha) и меняем цвет (обводка - color) границы графиков
Для геометрической функции geom_point() доступны следующие графические переменные:
x и yshape - тип символаcolor - цвет общий / цвет обводкиfill - заливка (если у символа есть внутренняя часть и обводка)size - размерstroke - толщина обводкиalpha - прозрачностьСимволы, доступные для geom_point():
Обратите внимание на то, как в зависимости от используемого символа в geom_point(), графическая переменная color будет определять либо цвет внутренней части символов, либо обводки.
ggplot(
penguins,
mapping = aes(
x = bill_len,
y = bill_dep,
color = species)) +
geom_point(shape = 16)ggplot(
penguins,
mapping = aes(
x = bill_len,
y = bill_dep,
color = species)) +
geom_point(shape = 1)В случае более сложных геометрических фигур и символов, у которых есть и внутренняя часть и обводка, цвет первой будет задаваться с помощью переменной fill, а второй - color.
ggplot(
penguins,
mapping = aes(x = bill_len, y = bill_dep, fill = species, color = island)) +
geom_point(shape = 21)Доступные графические переменные для каждой geom_ функции можно посмотреть в справке.
Когда мы хотим какой-то признак закодировать с помощью одной из графических переменных, например, с помощью цвета, необходимо его указать как аргумент функции aes(). Если цвет будет задан вне aes(), то он будет восприниматься как константа и все соответствующие элементы графика будут окрашены в этот цвет.
То, как у вас отображаются оси X, Y, как задаются цветовые шкалы и отображаются другие используемые на графике графические переменные, настраивается с помощью функций вида scale_x_, scale_y_, scale_color_, scale_fill_ (в общем виде scale_{aes}_). Выбирая нужную scale_ функцию, важно понимать, работаете ли вы с количественными или категориальными признаками, хотите ли вы задавать цветовую палитру вручную, использовать готовую или создавать градиент и т.д.
Важными параметрами этих функций являются breaks и labels. Через breaks можно подать вектор со значениями, которые будут отображаться по осям (через них будут проходить основные линии сетки) или в легенде. В свою очередь параметр labels помогает изменить то, как эти значения будут подписаны.
starwars %>%
ggplot(aes(x = height)) +
geom_density(fill = "yellowgreen") +
scale_x_continuous(
name = "Height in meters",
breaks = seq(80, 240, 40),
labels = seq(0.8, 2.4, 0.4))starwars, строим график плотности роста персонажей ЗВ
Пакет {scales} содержит много полезных функций для отображения подписей по осям.
starwars %>%
ggplot(aes(x = height)) +
geom_density(fill = "yellowgreen") +
scale_x_continuous(
name = "Height",
breaks = seq(80, 240, 40),
labels = scales::label_number(scale = 0.01, suffix = " m"))starwars, строим график плотности роста персонажей ЗВ
Если по оси X/Y отложены количественные признаки, то используются функции scale_x_continuous()/scale_y_continuous(), если категориальные - scale_x_discrete()/scale_y_discrete().
Функции scale_x_log10() и scale_y_log10() позволяют логарифмировать X и Y оси. Данная трансформация пригождается, когда у вас есть несколько наблюдений с высокими значениями признака, но основная масса наблюдений кучкуется ближе к 0.
starwars %>%
ggplot(aes(x = mass)) +
geom_histogram(fill = "yellowgreen") starwars %>%
ggplot(aes(x = mass)) +
geom_histogram(fill = "yellowgreen") +
scale_x_log10()Когда вы задаете цветовую графическую переменную (color или fill), то значениям этой переменной присваиваются цвета из стандартных палитр {ggplot2} - набор дискретных цветов для обозначения категориальных признаков и градиент для обозначения количественных признаков. Если вам не подходят стандартные цвета, то есть два варианта: вы используете другие готовые палитры и градиенты или создаете цветовую шкалу самостоятельно.
Из готовых палитр наиболее популярными являются палитры из пакетов {viridis} (нужно установить) и {RColorBrewer} (устанавливается вместе с {tidyverse}). Эти пакеты предоставляют несколько вариантов палитр, подходящих для визуализации как непрерывных количественных признаков, так и дискретных или категориальных признаков. Чтобы использовать в графике палитры из данных пакетов, нужно воспользоваться функциями scale_color_viridis() или scale_color_brewer() (или их версиями для fill). Также для использования палитр viridis можно воспользоваться функциями scale_color_viridis_c() (градиентная шкала), scale_color_viridis_d() (дискретная цветовая палитра) или scale_color_viridis_b() (градиент разбивается на бины) из пакета {ggplot2}.
starwars %>%
filter(homeworld %in% c("Naboo", "Tatooine")) %>%
ggplot(aes(x = mass, fill = homeworld)) +
geom_density(alpha = 0.6, color = "yellowgreen") +
scale_fill_brewer(palette = "Accent")starwars только персонажей с планет Набу и Татуин
Помимо названных выше двух пакетов существуют многие другие, предоставляющие различные цветовые палитры: {ggsci}, {ggthemes}, {wesanderson} и т.д.
В случае работы с категориальным признаком цветовую схему вручную можно задать с помощью функций scale_color_manual() или scale_fill_manual(). Если же вы изображаете с помощью цвета непрерывную количествуенную переменную, то стоит использовать градиент цвета. Градиент можно выстроить как переход между двумя цветами, которые будут соответствовать наименьшему (low) и наибольшему (high) значениям переменной. Если количественный признак предусматривает “срединное” значение (например, ноль, разделяющий положительные и отрицательные значения), то стоит указать дополнительную точку (mid), относительно которой будет строиться дивергентная цветовая палитра. Также можно строить градиент, проходящий через произвольное число цветов. Для этих трех разных ситауация используются три разные функции: scale_color_gradient(), scale_color_gradient2() и scale_color_gradientn(). Аналогичные функции есть и для графической переменной fill.
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height, color = mass)) +
geom_point(size = 5, alpha = 0.8) +
scale_color_gradient(
low = "#455e89", high = "#b7094c",
breaks = seq(50, 150, 50),
limits = c(30, 150))starwars только дроидов и гунганов
Как вы видели в примерах выше, цвета можно задавать с помощью HEX-кодов, например, “#4c9be8”, “#d9534f”, “#5cb85c”, но существуют и другие варианты:
colors()colors()[573]rgb()
rgb(244/255, 164/255, 96/255)Показаны первые 125 цветов и их названия из 657 доступных в R:
Для каждой дополнительной графической переменной (color, fill, shape, size и т.д.), которую вы используте для создания своего графика, появляется собственная легенда. Функция guides() предоставляет дополнительные опции для настройки отображения легенд. “Обычные” легенды, имеющие дискретные элементы, настраиваются с помощью функции guide_legend(), непрерывные цветовые шкалы - с помощью guide_colorbar().
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height, color = mass, size = mass)) +
geom_point(alpha = 0.8) +
scale_color_gradient(low = "#455e89", high = "#b7094c") +
scale_size_continuous(breaks = seq(40, 140, 40)) +
guides(
color = guide_colorbar(order = 1, title = "Body mass (kg)"),
size = guide_legend(order = 2, reverse = TRUE, title = ""))starwars только дроидов и гунганов
order), задаем названия (title), настраиваем порядок элементов (reverse) в легенде, объясняющей размер точек
Кроме того, с помощью функции guides() можно удалить одну из легенд: guides(size = "none").
Для добавления на график горизонтальных, вертикальных линий или линий с любым наклоном исаользуются функции geom_hline(), geom_vline() и geom_abline().
starwars %>%
ggplot(aes(x = height, y = mass)) +
geom_point(size = 3, alpha = 0.8, color = "coral") +
scale_y_log10() +
geom_vline(xintercept = 164, linetype = "dashed", color = "firebrick", linewidth = 1) +
coord_cartesian(xlim = c(0, 300))Произвольный текст можно добавить на график с помощью функции annotate().
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height)) +
geom_point(size = 5, color = "#b7094c", alpha = 0.5) +
annotate(
"text", x = 1.5, y = 200,
label = str_wrap("Редкий дроид достигает роста гунгана", 20))starwars только дроидов и гунганов
x = 1.5 означает между первой и второй категорией по X) и сам текст
Если же вы хотите добавить на график текстовые подписи, которые будут привязаны к определенным координатам и отрисовываемым геометрическим объектам, то следует использовать функции geom_text() или geom_label(). Вторая функция отличается от первой наличием рамки вокруг текста. У этих функций есть собственная графическая переменная label, через которую можно задать столбец, из которого брать текст для подписей.
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height)) +
geom_point(size = 5, color = "#b7094c", alpha = 0.5) +
geom_text(aes(label = name), nudge_x = 0.2)starwars только дроидов и гунганов
nudge_x использутся для сдвига по горизонтали)
Однако, как видно на примере графика выше, в некоторых случаях подписи будут накладываться друг на друга, что значительно затруднит восприятие информации. В такой ситуации удобно использовать функции geom_text_repel() и geom_label_repel() из пакета {ggrepel} (необходимо установить), которые минимизируют пересечения между подписями, располагая их в некотром случайном отдалении от заданных x,y координат.
library(ggrepel)
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height)) +
geom_point(size = 5, color = "#b7094c", alpha = 0.5) +
geom_text_repel(aes(label = name))install.packages("ggrepel"))
starwars только дроидов и гунганов
В ggplot-графиках по умолчанию используется серая тема (theme_grey()), которая задает вид всех элементов графика, которые не зависят от подаваемых на вход данных (фон графика, сетка, линии осей, размер, шрифт и положений подписей по осям и т.д.). В качестве альтернативы стандартной серой теме можно выбрать другие готовые (начните набирать theme_, и появится их список) или изменить отображение любого элемента графика самостоятельно с помощью функции theme(). Для настройки элементов графика используются три основные функции: element_text() для текстовых элементов, element_line() для всех элементов в виде линий и element_rect() для фонов и границ отдельных областей графика.
Ниже приведены некоторые параметры функции theme(), которые вам могут пригодиться в первую очередь:
aspect.ratio = 1 - соотношение сторон графика 1:1axis.text = element_text(color = "black", size = 12) - цвет подписей по X и Y осям черный, размер текста - 12 (увеличен по сравнению со стандартным)axis.text.x = element_text(angle = 45, hjust = 1) - подписи по оси X под углом 45°, выравнивание по горизонтали по правому краюlegend.position = "top" - легенда над графикомlegend.position = "none" - нет легендыelement_text()element_line()element_rect()Менять шрифты на графике может оказаться достаточно сложной задачей…
Для работы со шрифтами в R существует несколько пакетов: {showtext}, {extrafont}, {systemfonts} и другие (нужно устанавливать). Ниже приведен пример изменения шрифтов на графике с помощью пакета {showtext}. Он позволяет подгружать и использовать шрифты с сайта Google Fonts. Для того, чтобы шрифты корректно отображались в html-отчетах, генерируемых из .Rmd файлов, необходимо указать среди опций блока кода fig.showtext=TRUE.
library(showtext)
font_add_google("Oswald", "oswald")
font_add_google("Press Start 2P", "press_start")
showtext_auto()
starwars %>%
filter(species %in% c("Droid", "Gungan")) %>%
ggplot(aes(x = species, y = height)) +
geom_point(size = 5, color = "#b7094c", alpha = 0.5) +
geom_text_repel(aes(label = name), family = "press_start", ) +
theme(text = element_text(family = "oswald"))install.packages("showtext"))
starwars только дроидов и гунганов
family)
Для записи графика в файл удобно использовать функцию ggsave(). График можно записать в переменную и эту переменную указать как второй аргумент функции ggsave(), если этого не делать, то будет сохранен последний отрисованный график. Первый аргумент функции ggsave() - путь до файла с уканием нужно формата файла, куда будет записан график.
ggplot(...) + ...
ggsave("figures/my_plot.png")
# В названии файла указываете нужный формат
ggsave("figures/my_plot.pdf")
# ИЛИ
p <- ggplot(...) + ...
ggsave("figures/my_plot.png", plot = p)После записи в файл, проверяйте, что все сохранилось правильно. Например, размеры итоговой картинки (height и width) могут не подходить для вашего графика - все либо будет слишком мелко, либо элементы будут наезжать друг на друга.
ggsave(
"figures/my_plot.png", p,
dpi = 300, width = 10, height = 10, units = "cm") # dpi - разрешение картинкиЕсли вы будете менять размеры сохраняемого графика (параметры width и height), то наверняка заметите, что при маленьких размерах элементы вашего графика будут накладываться друг на друга, а текстовые подписи будут вылезать за границы. При слишком больших заданных размерах, наоборот, все элементы графика будут выглядеть слишком мелкими. В такой ситуации вы можете либо подобрать оптимальный размер для сохраняемого графика, либо, если вам нужен график с определенными размерами, вы можете задать масштабирование графика, например, с помощью возможностей пакета {ragg} (нужно установить). Для масштабирования графика вам нужно подгрузить пакет {ragg} и в вызове функции ggsave() использовать параметры device = agg_png и scaling = 0.5 (значение задаете в зависимости от своих нужд).
library(ragg)
ggplot(...) + ...
ggsave(
"figures/my_plot.png",
dpi = 300,
width = 10,
height = 10,
units = "cm",
device = agg_png,
scaling = 0.5)install.packages("ragg"))
Также можно использовать более универсальный вариант сохранения графика в файл, работающий и с построенными вне {ggplot2} графиками:
pdf("figures/my_plot.pdf") # Открыть файл для записи - есть и другие функции (png, tiff, ...)
p # Нарисовать график
dev.off() # Закрыть файлНа крайний случай существует возможность сохранить график в файл вручную в RStudio: в панели Plots: Export -> Save as…
Потренируйтесь создавать и сохранять графики. Готовые графики показаны для ориентира, не нужно пытаться их воспроизвести до мелочей.
Возьмите встроенный датасет starwars - в нем содержится информация о персонажах вселенной Звездные Войны. Больше информации об этом датасете можно узнать в справке ?starwars.
Отберите 2 планеты (homeworld), которые являются родиной самого большого количества героев ЗВ. Отберите только тех персонажей, которые происходят с этих двух планет, и постройте график дотплот (с помощью функции geom_point()), который бы показывал вес (mass) персонажей разных рас (species). По оси X - вес тела, по Y - раса (species), каждая точка - один персонаж. Цветом точки покажите гендерную идентичность героя (gender) информацию о расе, размером точки - его рост (height).
Подпишите оси, добавьте название графика и подберите цветовую палитру.
Сохраните график в подходящем размере и удобном вам формате.
Прочитайте датасет о напитках из Старбакса по ссылке https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2021/2021-12-21/starbucks.csv.
В этом датасете содержатся столбцы:
product_name - наименование напитка,size - размер (категория),milk - тип молока:
0 - без молока,1 - обезжиренное молоко,2 - 2% молоко,3 - соевое молоко,4 - кокосовое молоко,5 - цельное молоко,whip - добавляют ли сливки (0/1),serv_size_m_l - объем напитка (мл),calories - калории (ккал),total_fat_g - содержание жира (г),saturated_fat_g - содержание насыщенных жиров (г),trans_fat_g - содержание транс-жиров (г),cholesterol_mg - содержание холестерина (мг),sodium_mg - содержание натрия (мг),total_carbs_g - содержание углеводов (г),fiber_g- содержание пищевых волокон (г),sugar_g - содержание сахара (г),caffeine_mg - содержание кофеина (мг).Отберите только напитки, подходящие под следующие условия:
С помощью диаграммы рассеяния изобразите зависимость содержание кофеина (caffeine_mg) от калорийности напитка (calories). Цветом обозначьте тип молока.
На графике обозначьте пунктирной линией (используйте geom_hline(..., linetype = "dashed"), например) самое частое (мода) для отобранных напитков значение содержания кофеина. Поменяйте порядок задаваемых геометрических объектов (geom_*), чтобы линия проходила под точками.
Поменяйте отображаемые по осям значения так, чтобы интервал между ними составлял 50. Это можно сделать с помощью scale_x_continuous(breaks = *вектор с отображаемыми значениями*) и scale_y_continuous(breaks = *вектор с отображаемыми значениями*).
Пусть в легенде будут перечислены категории напитков следующим образом:
Подпишите оси, добавьте название графика и подберите цветовую палитру.
Сохраните график в подходящем размере и удобном вам формате.
Использйуте датасет про напитки из Старбакса из задания 3.
На одном графике постройте гитограмму и плотность распределения содержания сахара во всех напитках. geom_histogram и geom_density преобразовывают ваши данные и отрисовывают либо каунты, либо плотность. Найдите способ, чтобы оба geom_ отрисовывали значения по оси Y согласованно.
Подпишите оси, добавьте название графика. Подберите цветовую палитру.
Сохраните график в подходящем размере и удобном вам формате.
Прочитайте датасет о рейтинге различных эпизодов сериала “Могучие рейнджеры” по ссылке https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2024/2024-08-27/power_rangers_episodes.csv.
В этом датасете содержатся столбцы:
season_title - название сезона,episode_num - номер эпизода,episode_title - название эпизода,air_date - дата выхода эпизода,IMDB_rating - средний рейтинг эпизода на IMDB,total_votes - общее число голосов на IMDB,desc - описание эпизода.Визуализируйте распределение рейтинга эпизодов из разных сезонов. С помощью точек покажите рейтинг индивидуальных эпизодов, а также с помощью цветовой шкалы добавьте информацию об общем количестве голосов за каждый эпизод.
Подпишите оси, добавьте название графика. Подберите цветовую палитру.
Сохраните график в подходящем размере и удобном вам формате.
Загрузите датасет, содержащий информацию про цветение сакуры в Японии за 1953-2019 года. https://raw.githubusercontent.com/tacookson/data/master/sakura-flowering/sakura-modern.csv.
Изучите датасет! Про него можно прочитать дополнительно, например, здесь: https://github.com/tacookson/data/blob/master/sakura-flowering/README.md.
Информация про датасет:
Визуализируйте, как шел фронт цветения сакуры в Японии в разные годы, с помощью линейного графика - используйте geom_line. По горизонтали отложите года, по вертикали - дату или день начала цветения/полного цвета. Каждая кривая - это один город. Не забудьте сообщить, что вы решили визуализировать (какие переменные), в названиях осей и в названии графика.
Сохраните график в подходящем размере и удобном вам формате.
Примечания:
group = station_name.Есть несколько способов, как можно “подсветить” одну линию. Предлагаю воспользоваться одним из них или придумать свой. Вариант 1. Разделите датасет на 2: с выбранным городом и с остальными городами. В графике используйте geom_line дважды с этими двумя новыми датасетами (data = ...). Для каждого geom_line укажите свой цвет/прозрачность/что-то еще.
Вариант 2. Создайте новый столбец, где будут 2 значения: ваш город и остальные города. Используйте этот столбец, чтобы задать 2 цвета. Иногда бывает удобно создавать столбец сразу со значениями цветов/уровней прозрачности и др. и напрямую использовать их в качестве aesthetic.
Вариант 3. Поищите R пакеты, которые помогают легко решить эту задачу. Например, есть пакет {gghighlight} (он не входит в {tidyverse}, его нужно устанавливать отдельно).