Вопрос или проблема
Я пытаюсь построить боксплот с триплетом в качестве оси x (так что 64 триплета на оси x) и частотой каждого триплета в каждом из 6 образцов, затем закодировать цвет графика в зависимости от образца. Это фрагмент таблицы и код, который у меня есть на данный момент, а также тип графика, который я хочу.
library(tidyverse)
library(readxl)
marte <- read_xlsx("TrinucleotideFrequency06182021.xlsx")
marte <- gather (marte, "xzl.mmu.C57.testis.wt.adult.40S_crosslink.rep1+rept1.RPF.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.40S.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6", "xzl.mmu.C57.testis.wt.adult.40S_crosslink.rep2+rept2.RPF.R1.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.40S.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6", "xzl.mmu.C57.testis.wt.adult.40S_crosslink.rep3+rept3.RPF.R1.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.40S.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6", "xzl.mmu.C57.testis.wt.adult.80S_crosslink.rep1+rept1.RPF.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.RPF.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6", "xzl.mmu.C57.testis.wt.adult.80S_crosslink.rep2+rept2.RPF.R1.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.RPF.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6", "xzl.mmu.C57.testis.wt.adult.80S_crosslink.rep3+rept3.RPF.R1.trimmed.gz.x_rRNA.x_hairpin.mm10v1.unique.+jxn.bed13.RPF.sense.hybrid.utr3.1up.5end.PNLDC1.rep1.bed6",key="gene", value="value")
marte$gene <- as.factor(marte$Trinucleotide)
marte$group <- as.factor(marte$gene)
ggplot(marte, aes(x = gene, y = value, color = group)) +
geom_boxplot()
head (marte) дает следующий вывод, а ниже приведена часть таблицы, которую я использую для генерации графика, где первый столбец является триплетом, а остальные 6 – соответственно каждым геном.
Trinucleotide gene value group
<chr> <fct> <dbl> <fct>
1 AAA AAA 0.0214 AAA
2 TAG TAG 0.0199 TAG
3 AGC AGC 0.0132 AGC
4 TGT TGT 0.0338 TGT
5 GAT GAT 0.0130 GAT
6 CAC CAC 0.0112 CAC
AAA 0.021383202 0.016654469 0.022484448 0.025311535 0.025495724 0.02017925
TAG 0.019927531 0.018790672 0.015649845 0.02230479 0.019363723 0.02017925
AGC 0.013209711 0.016891825 0.014520044 0.014302046 0.014804269 0.012904701
TGT 0.033757832 0.034990209 0.031899462 0.034446096 0.034475058 0.031047513
GAT 0.013006661 0.007615167 0.009163947 0.010540757 0.008234933 0.012000828
CAC 0.011210666 0.015012758 0.01241387 0.011478221 0.011045046 0.013579884
GGG 0.012712095 0.011927132 0.013222864 0.011558249 0.014292494 0.014647108
CGA 0.00230219 0.000969203 0.001325076 0.002034983 0.001656292 0.002036438
TCG 0.004169681 0.007377811 0.005649008 0.005133189 0.006057561 0.006131094
ACA 0.011259284 0.013825979 0.010656401 0.009900537 0.010617015 0.009670358
Основываясь на объяснениях в комментариях, что вам нужно, так это отформатировать данные так, чтобы каждый образец имел правильную метку ‘группы’. Поскольку только 6 столбцов, я бы сделала это вручную, как показано ниже.
marte <- read_xlsx("TrinucleotideFrequency06182021.xlsx")
a40 <- data.frame(gene=marte$Trinucleotide,value=marte[,2])
b40 <- data.frame(gene=marte$Trinucleotide,value=marte[,3])
c40 <- data.frame(gene=marte$Trinucleotide,value=marte[,4])
a80 <- data.frame(gene=marte$Trinucleotide,value=marte[,5])
b80 <- data.frame(gene=marte$Trinucleotide,value=marte[,6])
c80 <- data.frame(gene=marte$Trinucleotide,value=marte[,7])
# эти действия не должны быть необходимы:
colnames(a40) <- c('gene','value')
colnames(b40) <- c('gene','value')
colnames(c40) <- c('gene','value')
colnames(a80) <- c('gene','value')
colnames(b80) <- c('gene','value')
colnames(c80) <- c('gene','value')
gp1 <- rbind(a40,b40,c40)
gp1$group <- rep('40s',nrow(gp1))
gp2 <- rbind(a80,b80,c80)
gp2$group <- rep('80s',nrow(gp2))
ggplot(marte, aes(x = gene, y = value, color = group)) +geom_boxplot()+ theme(axis.text.x = element_text(angle = 90))+coord_flip()
Объяснение: для каждого образца создается датафрейм, который содержит только значения из трех колонок этого образца. Три части конкатенируются по строкам (rbind
) с колонками gene
и value
, затем добавляется колонка group
, содержащая идентификатор группы (образца) в каждой строке.
Для справки, делать боксплоты только с двумя значениями – не лучший вариант, боксплот должен показывать распределение набора значений. Я бы предложила простые столбчатые диаграммы вместо этого, с двумя значениями, показанными как разные столбцы.
Ответ или решение
Как построить боксплот с несколькими столбцами в R
Создание боксплота для анализа частот триплетов нуклеотидов в образцах — это важная задача, которая поможет вам визуализировать распределение данных. В данной статье мы рассмотрим, как правильно подготовить данные и построить боксплот с использованием библиотеки ggplot2
в R.
1. Подготовка окружения
Для начала вам потребуется установить и загрузить необходимые библиотеки. В данном случае мы будем использовать tidyverse
и readxl
для работы с данными.
# Установка библиотеки (если еще не установлена)
install.packages("tidyverse")
install.packages("readxl")
# Загрузка библиотек
library(tidyverse)
library(readxl)
2. Чтение данных
Загрузим данные из Excel-файла. Убедитесь, что ваш файл находится в рабочем каталоге, или укажите полный путь к файлу.
marte <- read_xlsx("TrinucleotideFrequency06182021.xlsx")
3. Приведение данных к длинному формату
Для создания боксплота, необходимо преобразовать данные в длинный формат с помощью функции gather()
. Убедитесь, что у вас правильно указаны названия столбцов.
marte <- gather(marte,
key = "sample",
value = "frequency",
-Trinucleotide)
Теперь ваши данные должны выглядеть примерно следующим образом:
Trinucleotide sample frequency
AAA S1 0.0214
AAA S2 0.0199
TAG S1 0.0132
...
4. Добавление идентификаторов групп
Вам нужно установить идентификаторы групп для каждого образца. Это поможет легко расцветить боксплот в соответствии с образцами.
marte$group <- as.factor(marte$sample)
5. Построение боксплота
Теперь, когда ваши данные подготовлены, вы можете создать боксплот.
ggplot(marte, aes(x = Trinucleotide, y = frequency, fill = group)) +
geom_boxplot() +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
labs(title = "Частоты триплетов по образцам",
x = "Триплет",
y = "Частота") +
theme_minimal()
Здесь мы используем aes()
для установки x
, y
и fill
, чтобы цвет боксплота зависел от группы примеров.
6. Рекомендации
- Визуализация: Поскольку боксплоты лучше всего отображают распределение множества значений, убедитесь, что у вас достаточно данных для каждой группе (как минимум 5-6 значений).
- Анализ: Боксплот позволяет выявить выбросы и понять распределение значений в каждой группе. Если у вас очень мало значений, возможно, стоит рассмотреть альтернативные визуализации, такие как столбчатые диаграммы.
Заключение
Построение боксплота в R с использованием данных из нескольких столбцов — это простой и эффективный способ визуализировать распределение частот триплетов нуклеотидов в разных образцах. Правильная подготовка данных и использование подходящих функций в ggplot2
являются ключевыми для успешной визуализации.