Построение графика с помощью facet_wrap дает ошибку, размер которой должен быть 2 или 1, а не 28

У меня есть такой df:

Sample_ID group_classification Days_after_infection_1 category post-infection or 1st dose p.i. category# category post-1st dose post 1st dose category# category post-2nd dose post 2nd dose category# abs titers control_classification
120027_1 Control NA 0 0 NA NA NA NA Fractalkine_pg_mL_LOD(100) 5.502690e+03 control_positive
120027_1 Control NA 0 0 NA NA NA NA GM_CSF_pg_mL_LOD(0.12) 0.000000e+00 control_positive 
120027_1 Control NA 0 0 NA NA NA NA ITAC_pg_mL_LOD(1.5) 6.178953e+00 control_positive

Имена столбцов():

[1]"Sample_ID"                           "group_classification"               
[3] "Days_after_infection_1"              "category post-infection or 1st dose"
[5] "p.i. category#"                      "category post-1st dose"             
[7] "post 1st dose category#"             "category post-2nd dose"             
[9] "post 2nd dose category#"             "abs"                                
[11] "titers"                              "control_classification"      

У меня есть строка кода для выполнения dunn_test:

df.dunn.stat <- data.frame(df.tidy.3) %>% 
  # group_by(`category post-1st dose`) %>%
  group_by(abs) %>%
  # filter(abs == abs[i]) %>%
  dunn_test(titers ~ group_classification) %>% 
  add_y_position(scales = 'free_y')

Это дает мне следующий df:

 A tibble: 6 × 12
  abs             .y.   group1 group2    n1    n2 statistic      p p.adj p.adj.signif y.position groups
  <chr>           <chr> <chr>  <chr>  <int> <int>     <dbl>  <dbl> <dbl> <chr>             <dbl> <name>
1 Fractalkine_pg… tite… Contr… Induc…    10    14    -1.91  0.0559 0.329 ns               10085. <chr> 
2 Fractalkine_pg… tite… Contr… Natur…    10    38    -1.92  0.0548 0.329 ns               10333. <chr> 
3 Fractalkine_pg… tite… Contr… Hybrid    10    27    -1.71  0.0877 0.351 ns               10580. <chr> 
4 Fractalkine_pg… tite… Induc… Natur…    14    38     0.349 0.727  1     ns               10828. <chr> 
5 Fractalkine_pg… tite… Induc… Hybrid    14    27     0.484 0.628  1     ns               11075. <chr> 
6 Fractalkine_pg… tite… Natur… Hybrid    38    27     0.201 0.841  1     ns               11323. <chr> 

Если вы проверите столбец y.position, значения слишком большие, а если я сравню эти значения с моими основными точками df, будет еще хуже. Итак, я выполнил следующее: я изменил эти значения, чтобы они имели стандартные значения, которые соответствуют моим основным данным:

df.dunn.stat1 <- df.dunn.stat %>%
  group_by(abs) %>%
  mutate(y.position = c(7, 7.5, 8, 8.5, 9, 9.5))

Теперь столбец y.position имеет значения, зафиксированные на моем графике:

# A tibble: 6 × 12
# Groups:   abs [1]
  abs             .y.   group1 group2    n1    n2 statistic      p p.adj p.adj.signif y.position groups
  <chr>           <chr> <chr>  <chr>  <int> <int>     <dbl>  <dbl> <dbl> <chr>             <dbl> <name>
1 Fractalkine_pg… tite… Contr… Induc…    10    14    -1.91  0.0559 0.329 ns                  7   <chr> 
2 Fractalkine_pg… tite… Contr… Natur…    10    38    -1.92  0.0548 0.329 ns                  7.5 <chr> 
3 Fractalkine_pg… tite… Contr… Hybrid    10    27    -1.71  0.0877 0.351 ns                  8   <chr> 
4 Fractalkine_pg… tite… Induc… Natur…    14    38     0.349 0.727  1     ns                  8.5 <chr> 
5 Fractalkine_pg… tite… Induc… Hybrid    14    27     0.484 0.628  1     ns                  9   <chr> 
6 Fractalkine_pg… tite… Natur… Hybrid    38    27     0.201 0.841  1     ns                  9.5 <chr> 

Вот в чем проблема: я хочу построить facet_wrap, поэтому использую следующий код:

df.tidy.3 %>%
  ggplot(aes(x = group_classification, 
             y = titers)) +
  facet_wrap(~abs) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(data = natural.hybrid, 
              shape = 21, 
              width = 0.1, 
              size = 2,
              aes(fill = `category post-infection or 1st dose`))+
  geom_jitter(data = induced, 
              width = 0.1, 
              aes(color = `category post-1st dose`), 
              size = 2) +
  geom_jitter(data = control.df, width = 0.1,
              aes(color = 'Control_classification'), 
              size = 2) +
  scale_fill_viridis_d() +
  scale_color_manual(values = c(RColorBrewer::brewer.pal(3, 'Dark2')[c(1,3)], 
                                "black")) +
  # scale_y_continuous(trans = 'log10') +
  labs(x = '', 
       y = 'Cytokines Concentration') +
  stat_pvalue_manual(df.dunn.stat, 
                     step.increase = 0.1, 
                     hide.ns = 'p',
                     label = 'p.adj.signif',
                     # y.position = 20,
                     # position = position_dodge(0.8),
  )

В строке stat_pvalue_manual(df.dunn.stat,... находится ключ. Если я нанесу данные на свой старый df.dunn.stat, проблем не будет, график выполнен, однако с визуальными проблемами. Теперь, если я поставлю df.dunn.stat1, я получу следующую ошибку:

Error in `dplyr::mutate()`:
ℹ In argument: `label = as.character(data %>% pull("p.adj.signif"))`.
ℹ In group 1: `abs = "GM_CSF_pg_mL_LOD(0.12)"`.
Caused by error:
! `label` must be size 2 or 1, not 28.

Честно говоря, я не понимаю, почему это происходит, потому что числа 2 or 1 и 28 не имеют для меня смысла, потому что мои данные или уникальные значения из столбцов abs не содержат этих чисел.

Что я могу сделать, чтобы решить эту проблему?

Нужно ли мне вносить еще одну модификацию для построения графиков?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша ошибка может быть воспроизведена с помощью следующего кода:

df1 <- mtcars %>% 
  group_by(vs) %>% 
  dplyr::mutate(cyl = c(5,10))

Чтобы устранить проблему, попробуйте это

df.dunn.stat1 <- df.dunn.stat %>%
  dplyr::mutate(y.position = (y.position - 6500)/500)

Спасибо за идею, не могли бы вы объяснить свою идею?

Someone_1313 22.02.2024 14:42

Я забыл сказать, что с использованием вашего фактического подхода проблема решена, однако структура моих графиков аналогична подходу с использованием df.dunn.stat, который имеет экстремальные значения y.position, что означает, что все мои точки данных остаются внизу моего графика. а значения p находятся вверху, увеличивая y-axis. Кроме того, если я установлю диапазон y-axis, p-values не будет присутствовать на графиках.

Someone_1313 22.02.2024 16:17

Обратите внимание, я привел пример формулы y.position = (y.position - 6500)/500. Вам необходимо изменить его в соответствии с вашими потребностями в вашем реальном случае использования. Измените его так, чтобы значения y находились в желаемом диапазоне.

YBS 22.02.2024 19:20

В этом есть смысл, извините, я этого не осознавал. Спасибо за помощь!

Someone_1313 22.02.2024 19:21

Другие вопросы по теме

Как использовать отдельные дни на годовом графике
Рисование линий между странами на заранее определенной карте Робинсона
Как удалить любые ячейки сетки за пределами места их пересечения с многоугольником в ggplot
Как создать несколько осей Y в ggplot2 (по одной для каждой переменной)
Ошибка «неиспользуемый аргумент» при использовании «purrr::pwalk» для сохранения ggplots из столбца списка во вложенном фрейме данных
Несколько значений в одной плитке с помощью geom_tile
Постройте все графики, созданные в функции, с минимальным диапазоном оси Y, необходимым для отображения доверительного интервала (r)
Ggplot — Цветная геометрическая рабочий пример с заполненными точками
Можно ли построить доверительный интервал, выходящий за пределы диапазона в ggplot?
Я реорганизовал рабочий код в функцию - теперь я не могу понять, как передать аргумент столбца оси «x»