#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)