geom_bar проблемы с неправильным размещением значений оси y

#r #ggplot2 #bar-chart

Вопрос:

У меня есть два набора данных, каждый из которых содержит 10000 хромосомных областей. Затем я подсчитываю, сколько раз мои хромосомные области перекрываются с определенным хромосомным элементом (ЛИНИЕЙ). Я делаю это 4 раза, где я подсчитываю перекрытие, если моя хромосомная область перекрывается с 30%, 50%, 80% и 100% элементов ЛИНИИ.

Затем я хочу сделать столбик, показывающий, чем меньше процент перекрытия требуется для подсчета фактического перекрытия с линиями, тем больше совпадений вы получите.

Итак, простой пример того, что я сделал. Я определил свои векторы со значениями, которые мне нужны для выполнения facet_wrapt, заполнения и так далее.

 overlap <- c(0.3,0.5,0.8,1.0,
             0.3,0.5,0.8,1.0,
             0.3,0.5,0.8,1.0,
             0.3,0.5,0.8,1.0,
             0.3,0.5,0.8,1.0,
             0.3,0.5,0.8,1.0)

region <- c("chr_reg","chr_reg","chr_reg","chr_reg",
          "chr_reg","chr_reg","chr_reg","chr_reg",
          "chr_reg","chr_reg","chr_reg","chr_reg",
          "random","random","random","random",
          "random","random","random","random",
          "random","random","random","random")

Element <- c("LINE1","LINE1","LINE1","LINE1",
         "LINE2","LINE2","LINE2","LINE2",
         "LINE3","LINE3","LINE3","LINE3",
         "LINE1","LINE1","LINE1","LINE1",
         "LINE2","LINE2","LINE2","LINE2",
         "LINE3","LINE3","LINE3","LINE3")

No <- c(1100,1000,1000,900,
        3000,3000,2900,2900,
        1900,1500,1700,1500,
        2500,2500,2500,2600,
        5200,5000,5200,5000,
        3500,3000,3500,3600)


df_full2 <- as.data.frame(cbind(overlap,Element,region,No))

ggplot(df_full2,aes(x = region, y = No,fill = overlap))   
  geom_bar(stat = "identity", position = "dodge",colour="black") 
  theme_bw()   facet_wrap(~Element)
 

и я получаю следующий сюжет

введите описание изображения здесь

Моя проблема в том, что я хотел бы, чтобы в СТРОКЕ 1 фиолетовая полоса со 100-процентным перекрытием была самой низкой, так как она имеет наименьшее значение по оси y 955, поэтому я не уверен, почему она показана выше, чем другие для этой группы LINE1? Я также хотел бы, чтобы фиолетовая полоса была слева, как для двух других групп, поэтому отсортирована по значениям. Похоже, это работает для групп LINE2 и LINE3, где наименьшие значения находятся слева, и они красиво разделены для каждой СТРОКИ на «chr_reg» и «случайный». вот почему мне трудно понять, почему возникают проблемы с «LINE1» «chr_reg».

Так что в идеале что-то вроде этого: введите описание изображения здесь

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

1. можете ли вы как-то показать желаемый результат?

2. Мой желаемый результат был бы просто в первой группе «LINE1», чтобы фиолетовая полоса для группы «chr_reg» была слева и была наименьшей полосой, так как, если вы посмотрите на ось y, она имеет значение 955, что ниже, чем все остальные полосы, в той же группе «LINE1- > chr_reg», тогда синяя полоса с 0,8 имеет значение 1008, поэтому фиолетовый должен быть меньше. Таким образом, желаемый результат-это просто я хочу, чтобы группа LINE1 имела тот же результат, что и в группах LINE2 и LINE3, где порядок и значения верны. Имеет ли это смысл? Спасибо.

3. Рассмотрите возможность использования df_full2 <- data.frame(overlap,Element,region,No) для построения фрейма данных.

4. Ронак прав. Ваше использование cbind заставляет R принудительно приводить все данные к одному и тому же типу, поэтому «Нет» преобразуется в символ и отображается неправильно. data.frame следует использовать без cbind .

Ответ №1:

No является ли персонаж просто добавлением as.integer

 ggplot(df_full3,aes(x = region, y = as.integer(No),fill = overlap))   
  geom_bar(stat = "identity", position = "dodge",colour="black") 
  theme_bw()   facet_wrap(~Element)
 

введите описание изображения здесь

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

1. Я согласен integer , что в данном случае это имеет больше смысла. Я обновил свой ответ на integer кредиты для вас! 🙂

2. Я думаю, что мы оба предлагаем хорошее решение! Внимание!

Ответ №2:

Ваши данные не в правильном формате, поэтому ваш сюжет выглядит «странно». No должна быть integer колонка:

 library(tidyverse)
df_full2 %>%
        mutate(No = as.integer(No)) %>% 
        ggplot(aes(x = region, y = No,fill = overlap))   
        geom_bar(stat = "identity", position = "dodge",colour="black") 
        theme_bw()   facet_wrap(~Element)
 

введите описание изображения здесь

В зависимости от ваших потребностей вы также можете захотеть преобразовать overlap в numeric переменную:

 df_full2 %>%
        mutate(No = as.integer(No),
               overlap = as.numeric(overlap)) %>% 
        ggplot(aes(x = region, y = No, fill = overlap))   
        geom_bar(stat = "identity", position = "dodge",colour="black") 
        scale_fill_viridis_c()  
        theme_bw()   facet_wrap(~Element)
 

введите описание изображения здесь

Или, если вы ДЕЙСТВИТЕЛЬНО хотите сохранить исходные столбцы как есть и соответствовать желаемому выходному графику:

 df_full2 %>%
        mutate(No = fct_reorder(No, as.integer(No))) %>% 
        ggplot(aes(x = region, y = No, fill = overlap))   
        geom_bar(stat = "identity", position = "dodge",colour="black")  
        theme_bw()   facet_wrap(~Element)
 

введите описание изображения здесь