Почему fct_inorder не представляет мой фактор в порядке появления?

#r #ggplot2 #forcats

Вопрос:

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

Я пытаюсь построить точечный график таким образом, чтобы цвета соответствовали диапазону значений изменения сгиба, а размер точки соответствовал p-значению. Я начинаю с передачи csv-файла с четырьмя столбцами «Гены», «Концентрация», «изменение сгиба» и «p-значение». Ниже приведены некоторые примеры данных и код, который я пытался сгенерировать точечный график с концентрацией на оси x, генами на оси y и каждым цветом точки, соответствующим изменению сгиба (но я хочу указать диапазон значений, соответствующих одному цвету, как показано ниже), а размер точки равен p-значению.

 genes <- c('ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN', 'ABC', 'CDE', 'EFG', 'HIJ', 'JKL', 'LMN')
concentration <- c('PR1.2', 'PR1.2','PR1.2', 'PR1.2','PR1.2', 'PR1.2','PR2.4', 'PR2.4','PR2.4', 'PR2.4','PR2.4','PR2.4', 'PR3.6', 'PR3.6','PR3.6', 'PR3.6','PR3.6','PR3.6','PR1.2T', 'PR1.2T','PR1.2T', 'PR1.2T','PR1.2T', 'PR1.2T', 'PR2.4T', 'PR2.4T','PR2.4T', 'PR2.4T','PR2.4T', 'PR2.4T', 'PR3.6T', 'PR3.6T','PR3.6T', 'PR3.6T','PR3.6T','PR3.6T')
foldchange <- c(577.19, 2.642, -697.90, 50.23, 12.582, -30.542, -15.376, 30.674, -1.973, -5.324, -132.761, 146.678, 500.19, 2.233, -656.90, 49.23, 13.582, -80.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542, 577.19, 2.642, -697.90, 50.23, 12.582, -30.542)
pval <- c(4, 2, 2, 2, 3, 3, 2, 3,1,1,4,4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldcahnge, pval)

f <- fct_inorder(genes)
g <- fct_inorder(concentration)

# now make dot plot using ggplot2 
p <- ggplot(data, aes(x=concentration, y=genes, size=pval))   labs(y="Gene")  
     geom_point(alpha = 0.9)   geom_point(aes(colour = cut(foldchange), c(Inf, 500, 250, 
                                         100, 50, 25, 10, 5, 2, -2, 5, -10, -25, -50, 
                                         -100, -250, -500, -Inf))))   
     scale_color_manual(name = "fold change", values= c("(500, Inf]" = "firebrick4", 
                                                        "(250,500]" = "firebrick", 
                                                        "(100,250]" = "red3",
                                                        "(500,100] = "red2", 
                                                        "(25,50]" = "red",
                                                        "(10,25]" = "firebrick2", 
                                                        "(5,10]" = "firebrick1", 
                                                        "(2,5]" = "rosybrown1", 
                                                        "(-2,2]" = "gray98"
                                                        "(-5,-2]" = "lightskyblue",
                                                        "(-10,-5]" = "deepskyblue", 
                                                        "(-25,-10]" = "dodgerblue2", 
                                                        "(-50,-25]" = "dodgerblue4", 
                                                        "(-100,-50]" = "blue"
                                                        "(-250,-100]" = "blue3"
                                                        "(-500,-250]" = "darkblue"
                                                        "(-Inf,-500]" = "navy"),
                     labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"))
p   scale_size(range = c(1,4), breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001")
 

Здесь у меня одинаковые концентрации одного и того же препарата, но в разных клеточных линиях, которые ничем не обозначены после концентрации или буквой «Т» для клеточной линии «Т». У меня возникла проблема, когда одна из концентраций вышла из строя, но с остальными все в порядке. Когда я запускаю это, он возвращает точечный график, в котором порядок столбцов «PR1.2», «PR2.4», «PR2.4T», «PR3.6», «PR1.2T», «PR3.6T». Я хочу, чтобы они были в порядке строк ячеек: «PR1.2», «PR2.4», «PR3.6», «PR1.2T», «PR2.4T», «PR3.6T». Кто-нибудь может объяснить, почему мои концентрации не в правильном порядке и как это исправить? Заранее спасибо!

Комментарии:

1. fct_inorder только изменяет порядок уровней фактора, на самом деле это не делает его «упорядоченным фактором» (см. ?factor ggplot будет сортировать факторы в алфавитном порядке, если только это не упорядоченный фактор.

2. Однако в вашем коде есть ряд проблем, из-за которых трудно определить конкретную ошибку, так как она как есть не запускается. Некоторые из них, с которыми я столкнулся: опечатка foldcahnge при создании фрейма данных , отсутствие близкой кавычки scale_colour_manual (500,100] , дополнительные скобки в конце geom_point , f и g на самом деле их нет data , поэтому они не отображаются. Я предлагаю вам попытаться очистить это, чтобы запустить в новом сеансе R, чтобы поймать эти ошибки, так как в противном случае трудно понять реальную проблему

Ответ №1:

В вашем коде есть некоторые опечатки — если вы исправите их и внесете некоторые незначительные изменения, мне кажется, что ваш код работает должным образом:

 library(ggplot2)
library(forcats)

genes <- fct_inorder(
  f = c(
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN'
  ),
  ordered = TRUE
)
concentration <-
  fct_inorder(
    f = c(
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T'
    ),
    ordered = TRUE
  )
foldchange <-
  c(
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    -15.376,
    30.674,
    -1.973,
    -5.324,
    -132.761,
    146.678,
    500.19,
    2.233,-656.90,
    49.23,
    13.582,
    -80.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542
  )
pval <- c(4, 2, 2, 2, 3, 3, 2, 3, 1, 1, 4, 4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldchange, pval)


# now make dot plot using ggplot2
p <- ggplot(data, aes(x = concentration, y = genes, size = pval))  
  geom_point(alpha = 0.9)  
  geom_point(aes(colour = cut(foldchange,
                              breaks = c(
    500,
    250,
    100,
    50,
    25,
    10,
    5,
    2,
    -2,
    -5,
    -10,
    -25,
    -50,
    -100,
    -250,
    -500
  ))))  
  labs(y = "Gene")  
  scale_color_manual(
    name = "fold change",
    values = c(
      "(500, Inf]" = "firebrick4",
      "(250,500]" = "firebrick",
      "(100,250]" = "red3",
      "(500,100]" = "red2",
      "(25,50]" = "red",
      "(10,25]" = "firebrick2",
      "(5,10]" = "firebrick1",
      "(2,5]" = "rosybrown1",
      "(-2,2]" = "gray98",
      "(-5,-2]" = "lightskyblue",
      "(-10,-5]" = "deepskyblue",
      "(-25,-10]" = "dodgerblue2",
      "(-50,-25]" = "dodgerblue4",
      "(-100,-50]" = "blue",
      "(-250,-100]" = "blue3",
      "(-500,-250]" = "darkblue",
      "(-Inf,-500]" = "navy"),
    labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"),
    breaks = c(500, 250, 100, 50, 25, 10, 5, 2, -2, -5, -10, -25, -50, -100, -250, -500))
p   scale_size(breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001"))
 

пример_1.png

Было трудно найти опечатки в исходном коде из — за форматирования-если вы используете RStudio, вы можете переформатировать/переформатировать свой код с помощью Меню>Код>>Переформатировать код / Меню>>>Код>>>>Переформатировать строки, и это облегчает просмотр таких вещей, как пропущенная запятая.

Редактировать

Если вы хотите указать порядок фактора (например, «гены»), вы можете использовать базу R factor вместо forcats fct_inorder . Например.

 genes <- factor(x = c(
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN',
    'ABC',
    'CDE',
    'EFG',
    'HIJ',
    'JKL',
    'LMN'
  ), levels = c(
    'LMN',
    'JKL',
    'HIJ',
    'EFG',
    'CDE',
    'ABC'
  ),
  ordered = TRUE
)
concentration <-
  fct_inorder(
    f = c(
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR1.2',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR2.4',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR3.6',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR1.2T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR2.4T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T',
      'PR3.6T'
    ),
    ordered = TRUE
  )
foldchange <-
  c(
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    -15.376,
    30.674,
    -1.973,
    -5.324,
    -132.761,
    146.678,
    500.19,
    2.233,-656.90,
    49.23,
    13.582,
    -80.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542,
    577.19,
    2.642,
    -697.90,
    50.23,
    12.582,
    -30.542
  )
pval <- c(4, 2, 2, 2, 3, 3, 2, 3, 1, 1, 4, 4, 4, 2, 2, 2, 3, 3)
data <- data.frame(genes, concentration, foldchange, pval)


# now make dot plot using ggplot2
p <- ggplot(data, aes(x = concentration, y = genes, size = pval))  
  geom_point(alpha = 0.9)  
  geom_point(aes(colour = cut(foldchange,
                              breaks = c(
    500,
    250,
    100,
    50,
    25,
    10,
    5,
    2,
    -2,
    -5,
    -10,
    -25,
    -50,
    -100,
    -250,
    -500
  ))))  
  labs(y = "Gene")  
  scale_color_manual(
    name = "fold change",
    values = c(
      "(500, Inf]" = "firebrick4",
      "(250,500]" = "firebrick",
      "(100,250]" = "red3",
      "(500,100]" = "red2",
      "(25,50]" = "red",
      "(10,25]" = "firebrick2",
      "(5,10]" = "firebrick1",
      "(2,5]" = "rosybrown1",
      "(-2,2]" = "gray98",
      "(-5,-2]" = "lightskyblue",
      "(-10,-5]" = "deepskyblue",
      "(-25,-10]" = "dodgerblue2",
      "(-50,-25]" = "dodgerblue4",
      "(-100,-50]" = "blue",
      "(-250,-100]" = "blue3",
      "(-500,-250]" = "darkblue",
      "(-Inf,-500]" = "navy"),
    labels = c("500", "250", "100", "50", "25", "10", "5", "2", "-2", "-5", "-10", "-25", "-50", "-100", "-250", "-500"),
    breaks = c(500, 250, 100, 50, 25, 10, 5, 2, -2, -5, -10, -25, -50, -100, -250, -500))
p   scale_size(breaks = c(1,2,3,4), labels=c("pval >0.05", "0.01<pval<0.05", "0.001<pval<0.01", "pval<0.001"))
 

пример_2.png