Могу ли я сохранить постоянную ширину полосы на графике фасета R с разным количеством категорий в каждом фасете?

Я надеюсь, что кто-то может помочь мне с моей проблемой:

  • Мои данные состоят из категорий, которые содержат ряд генов с повышенной и пониженной регуляцией. Я хочу, чтобы они отображались как горизонтальные столбцы с накоплением. Это работает
  • Я отсортировал сгенерированные категории генов двумя методами (Terms), UP_Keyword и GO-Term. Они дали разное количество категорий генов. Проблем с обшивкой граней нет.
# A tibble: 10 x 4
   Category             Term       Reg   Reg_val  
   <chr>                 <chr>      <chr>   <dbl> 
 1 Transport            UP_Keyword Up         63  
 2 Transmembrane helix  UP_Keyword Up        341  
 3 Transmembrane        UP_Keyword Up        344  
 4 Transport            UP_Keyword Down        3  
 5 Transmembrane helix  UP_Keyword Down       12  
 6 Transmembrane        UP_Keyword Down        9  
 7 translation          GO_term    Up         41  
 8 glycolytic process   GO_term    Up          9  
 9 translation          GO_term    Down        0  
10 glycolytic process   GO_term    Down        1  
structure(
  list(
    Category = c(
      "Transport",
      "Transmembrane helix",
      "Transmembrane",
      "Transport",
      "Transmembrane helix",
      "Transmembrane",
      "translation",
      "glycolytic process",
      "translation",
      "glycolytic process"
    ),
    Term = c(
      "UP_Keyword",
      "UP_Keyword",
      "UP_Keyword",
      "UP_Keyword",
      "UP_Keyword",
      "UP_Keyword",
      "GO_term",
      "GO_term",
      "GO_term",
      "GO_term"
    ),
    Reg = c(
      "Up",
      "Up",
      "Up",
      "Down",
      "Down",
      "Down",
      "Up",
      "Up",
      "Down",
      "Down"
    ),
    Reg_val = c(63, 341, 344, 3, 12,
                9, 41, 9, 0, 1)
  ),
  row.names = c(NA,-10L),
  class = c("tbl_df",
            "tbl", "data.frame")
)
ex_plot <- ggplot(example_data, aes(x=Reg_val, y=Category, fill=Reg))+
  geom_col(width=0.5)+
  facet_wrap(.~Term, nrow=2, scales="free")

Вот как сейчас выглядит мой график

  • Я хочу, чтобы полосы были одинаковой ширины во всех аспектах. Есть ли способ сделать это?
  • Я нашел возможное решение здесь: https://community.rstudio.com/t/preserve-constant-bar-widths-for-uneven-faceted-plots/26837 Однако простое добавление space=free внутри facet_wrap() не приводит ни к каким изменениям, кроме предупреждения : неиспользуемый аргумент (пробел = свободен)

Если у кого-то есть решение моей проблемы, буду очень благодарен. Пожалуйста, постарайтесь объяснить так, чтобы это было понятно простому биологу.


person Michelle T.    schedule 03.01.2021    source источник
comment
Пожалуйста, поделитесь данными вашего примера как dput(), чтобы мы могли скопировать/вставить их в R для тестирования. См. как сделать воспроизводимый пример   -  person MrFlick    schedule 03.01.2021


Ответы (1)


Способ facet_wrap() указания фасетов не допускает аргумента space = "free"; это аргумент для facet_grid().

В зависимости от того, где вы хотите разместить метки/заголовки фасетов, вы можете использовать либо facet_grid(), либо facet_row() из пакета ggforce. Примеры ниже.

library(ggplot2)

df <- data.frame(
  Category = c("Transport", "Transmembrane helix", "Transmembrane",
               "Transport", "Transmembrane helix", "Transmembrane",
               "translation", "glycolytic process",
               "translation", "glycolytic process"),
  Term = rep(c("UP_Keyword", "GO_term"), c(6, 4)),
  Reg = rep(c("Up", "Down", "Up", "Down"), c(3, 3, 2, 2)),
  Reg_val = c(63, 341, 344, 3, 12, 9, 41, 9, 0, 1)
)

# Make the core plot
plot <- ggplot(df, aes(Reg_val, Category, fill = Reg)) +
  geom_col(width = 0.5)

plot + facet_grid(Term ~ ., scales = "free", space = "free")

plot + ggforce::facet_col(~ Term, space = "free", scales = "free_y")

Создана 03 января 2021 г. в пакете reprex (v0.3.0)

person teunbrand    schedule 03.01.2021