Объедините 4 гистограммы в один график в R - PullRequest
1 голос
/ 29 марта 2020

Я хочу создать гистограмму, используя R, которая будет описывать частоту гена V в 4 отделах тела. У меня есть эта таблица:

head(my_data)
# A tibble: 6 x 8
  Tumor    ...2        BM       ...4        DLN      ...6       Blood   ...8      
  <chr>    <chr>       <chr>    <chr>       <chr>    <chr>      <chr>   <chr>     
1 V hit    frequency   V hit    frequency   V hit    frequency  V hit   frequency 
2 IGHV3-1~ 0.54386205~ IGHV10-~ 0.22723742~ IGHV1-5~ 0.1132060~ IGHV5-~ 0.1417894~
3 IGHV5-1~ 0.16148068~ IGHV5-6~ 7.62620114~ IGHV5-1~ 0.1010986~ IGHV7-~ 0.1133675~
4 IGHV10-~ 3.18440869~ IGHV1-6~ 5.68199208~ IGHV1-6~ 8.1465889~ IGHV2-~ 6.4763474~
5 IGHV5-6~ 2.71468704~ IGHV3-1~ 5.24995831~ IGHV5-6~ 7.1625980~ IGHV5-~ 6.3008918~
6 IGHV6-3~ 2.71460485~ IGHV1-9~ 4.19517008~ IGHV1-7~ 4.7428361~ IGHV1-~ 5.0785188~
> 

dput(my_data)
structure(list(Tumor = c("V hit", "IGHV3-1*00", "IGHV5-17*00", 
"IGHV10-1*00", "IGHV5-6*00", "IGHV6-3*00", "IGHV2-9*00", "IGHV5-4*00", 
"IGHV1-9*00"), ...2 = c("frequency", "0.54386205717535796", "0.161480687577157", 
"3.1844086931792998E-2", "2.7146870412713998E-2", "2.7146048502561901E-2", 
"2.4098405658687001E-2", "2.1746920713615302E-2", "1.6909157558532301E-2"
), BM = c("V hit", "IGHV10-3*00", "IGHV5-6*00", "IGHV1-62-3*00", 
"IGHV3-1*00", "IGHV1-9*00", "IGHV10-1*00", "IGHV2-9*00", "IGHV4-2*00"
), ...4 = c("frequency", "0.22723742785161699", "7.62620114066965E-2", 
"5.6819920833780603E-2", "5.2499583155365397E-2", "4.1951700840313098E-2", 
"3.5214806321420301E-2", "3.2695465872415799E-2", "3.0610100659414E-2"
), DLN = c("V hit", "IGHV1-50*00", "IGHV5-17*00", "IGHV1-62-3*00", 
"IGHV5-6*00", "IGHV1-7*00", "IGHV1-4*00", "IGHV6-3*00", "IGHV10-1*00"
), ...6 = c("frequency", "0.113206013467841", "0.101098647226429", 
"8.1465889741680994E-2", "7.1625980782229995E-2", "4.7428361184553902E-2", 
"4.4690299561054497E-2", "4.3051740808241597E-2", "3.9509373582839201E-2"
), Blood = c("V hit", "IGHV5-6*00", "IGHV7-3*00", "IGHV2-9*00", 
"IGHV5-17*00", "IGHV1-67*00", "IGHV1-62-3*00", "IGHV1-7*00", 
"IGHV1-9*00"), ...8 = c("frequency", "0.141789453276464", "0.113367584335014", 
"6.4763474214811906E-2", "6.3008918185343196E-2", "5.0785188057386597E-2", 
"5.0504071345482703E-2", "4.52113222179139E-2", "3.8183404420318E-2"
)), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame"
))

(^ это лишь малая часть моих полных данных.)

Опухоль, кровь, BM и DLN - мои отсеки, и каждый из них имеет свои гены V и их частоты. Я хочу 1 гистограмму: ось X будет V генами, и для каждого v гена я хочу 4 бара, 1 для каждого отделения. Ось Y будет частотами.

Я предполагаю, что мне нужно создать df, который имеет только один столбец всех v-генов и несколько столбцов частот в каждом из отсеков, но я не знаю, как сделать это. Любая помощь будет оценена !!

Спасибо, Ligal.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Очистить данные

df <- df[-1,] # remove unwanted row
compart <- names(df)[seq(1,8,2)] # compartment names
not_compart <- names(df)[seq(2,8,2)] # not compartment names

# melt data from wide to long
library('data.table')
setDT(df)[, id := 1:.N] # assign id
df <- melt(df, id.vars = 'id', 
           measure.vars = list(compart, not_compart ),
           variable.name = "compartments",
           value.name = c("genes", "frequency"))
# change names of compartments
df[, compartments := factor(compartments, levels = seq_along(compart), labels = compart)]
# change frequency values from character to numeric
df[, frequency := as.numeric(frequency)]

Данные - вывод

head(df)
#    id compartments       genes  frequency
# 1:  1        Tumor  IGHV3-1*00 0.54386206
# 2:  2        Tumor IGHV5-17*00 0.16148069
# 3:  3        Tumor IGHV10-1*00 0.03184409
# 4:  4        Tumor  IGHV5-6*00 0.02714687
# 5:  5        Tumor  IGHV6-3*00 0.02714605
# 6:  6        Tumor  IGHV2-9*00 0.02409841

Участок

library('ggplot2')
ggplot(data = df, mapping = aes(x = genes, y = frequency)) + 
  geom_bar(stat = "identity") +
  coord_flip() +
  facet_wrap(. ~ compartments, scales = "free_y" ) +
  theme_bw() 

График

enter image description here

Участок 2

ggplot(data = df, mapping = aes(x = compartments, y = frequency)) + 
  geom_bar(stat = "identity") +
  coord_flip() +
  facet_wrap(. ~ genes, scales = "free_y" ) +
  theme_bw() 

График2

enter image description here

Участок-3

ggplot(data = df, mapping = aes(x = genes, y = frequency, color = compartments, fill = compartments, group = compartments)) + 
  geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

График- 3 enter image description here

0 голосов
/ 29 марта 2020

Попробуйте это:

library(dplyr)
library(tidyr)
library(purrr)
library(ggplot2)

my_data <- structure(list(Tumor = c(
  "V hit", "IGHV3-1*00", "IGHV5-17*00",
  "IGHV10-1*00", "IGHV5-6*00", "IGHV6-3*00", "IGHV2-9*00", "IGHV5-4*00",
  "IGHV1-9*00"
), ...2 = c(
  "frequency", "0.54386205717535796", "0.161480687577157",
  "3.1844086931792998E-2", "2.7146870412713998E-2", "2.7146048502561901E-2",
  "2.4098405658687001E-2", "2.1746920713615302E-2", "1.6909157558532301E-2"
), BM = c(
  "V hit", "IGHV10-3*00", "IGHV5-6*00", "IGHV1-62-3*00",
  "IGHV3-1*00", "IGHV1-9*00", "IGHV10-1*00", "IGHV2-9*00", "IGHV4-2*00"
), ...4 = c(
  "frequency", "0.22723742785161699", "7.62620114066965E-2",
  "5.6819920833780603E-2", "5.2499583155365397E-2", "4.1951700840313098E-2",
  "3.5214806321420301E-2", "3.2695465872415799E-2", "3.0610100659414E-2"
), DLN = c(
  "V hit", "IGHV1-50*00", "IGHV5-17*00", "IGHV1-62-3*00",
  "IGHV5-6*00", "IGHV1-7*00", "IGHV1-4*00", "IGHV6-3*00", "IGHV10-1*00"
), ...6 = c(
  "frequency", "0.113206013467841", "0.101098647226429",
  "8.1465889741680994E-2", "7.1625980782229995E-2", "4.7428361184553902E-2",
  "4.4690299561054497E-2", "4.3051740808241597E-2", "3.9509373582839201E-2"
), Blood = c(
  "V hit", "IGHV5-6*00", "IGHV7-3*00", "IGHV2-9*00",
  "IGHV5-17*00", "IGHV1-67*00", "IGHV1-62-3*00", "IGHV1-7*00",
  "IGHV1-9*00"
), ...8 = c(
  "frequency", "0.141789453276464", "0.113367584335014",
  "6.4763474214811906E-2", "6.3008918185343196E-2", "5.0785188057386597E-2",
  "5.0504071345482703E-2", "4.52113222179139E-2", "3.8183404420318E-2"
)), row.names = c(NA, -9L), class = c("tbl_df", "tbl", "data.frame"))

# Tidy the dataset
my_data <- slice(my_data, -1)

## Separate the data columns for each compartment and put them in a list
df_tidy <- list(tumor = my_data[1:2], bm = my_data[3:4], dln = my_data[5:6], blood = my_data[7:8]) %>%
  ## Rename the data columns
  map(~ rename(.x, v_hit = 1, freq = 2)) %>%
  ## Bind the four dfs together into one df
  bind_rows(.id = "compartment") %>%
  ## Convert the frequencies to numeric values
  mutate(freq = as.numeric(freq))
head(df_tidy)
#> # A tibble: 6 x 3
#>   compartment v_hit         freq
#>   <chr>       <chr>        <dbl>
#> 1 tumor       IGHV3-1*00  0.544 
#> 2 tumor       IGHV5-17*00 0.161 
#> 3 tumor       IGHV10-1*00 0.0318
#> 4 tumor       IGHV5-6*00  0.0271
#> 5 tumor       IGHV6-3*00  0.0271
#> 6 tumor       IGHV2-9*00  0.0241

# Barplot
ggplot(df_tidy, aes(v_hit, freq, fill = compartment)) +
  geom_col() +
  coord_flip() +
  facet_wrap(~compartment, scales = "free_y") +
  guides(fill = FALSE)

Создано в 2020-03-29 пакетом представить (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...