R ggplot2: Как сделать гистограмму и цвет по разным столбцам? - PullRequest
0 голосов
/ 14 февраля 2020

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

Для контекста мои данные выглядят так: (имена столбцов)

​

|  Name  |  Total Enrichment % (A+B+C+D)  |  %A  |  %B  |  %C  |  %D  |

Я хочу сгенерировать гистограмму, показывающую распределение столбца общего обогащения, а затем заполнить столбец четырьмя цветами, показывающими различные проценты A , B, C и D.

Я пытался преобразовать данные в длинный формат, но все же я не могу получить именно то, что хочу.

Любой совет быть очень полезным! Большое спасибо!

Вот пример (это не исходные данные, а лишь малая их часть):

    dat <- read.table(text = "Name Total A B C D
1 0.1396104 0.029220779 0.009740260 0.029220779 0.07142857
2 0.1250000 0.010869565 0.021739130 0.016304348 0.07608696
3 0.1337580 0.006369427 0.000000000 0.025477707 0.10191083
4 0.1239669 0.016528926 0.024793388 0.033057851 0.04958678
5 0.1242938 0.011299435 0.016949153 0.039548023 0.05649718
6 0.1311475 0.000000000 0.000000000 0.021857923 0.10928962
7 0.1376147 0.004587156 0.004587156 0.004587156 0.12385321
8 0.1574074 0.046296296 0.018518519 0.032407407 0.06018519
9 0.1269036 0.010152284 0.010152284 0.020304569 0.08629442", sep = "",    header=T)

Моя цель - создать гистограмму с полным обогащением. данные, но с каждым столбцом, заполненным другими переменными вклада (A, B, C и D)

Спасибо!

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

Благодаря потрясающей помощи и комментариям StupidWolf, я смог немного приблизиться к тому, что хочу.

Вот то, что я до сих пор получил (это не идеально, но пока все хорошо)

enter image description here

Что бы я хотел Я хотел бы иметь ось Y в логарифмическом масштабе c, так как у меня много данных в нижнем диапазоне, и я также заинтересован в данных с более высоким обогащением. Кроме того, кто-нибудь знает, почему бары не заполнены? Почему эти пробелы?

Еще раз, большое спасибо за вашу помощь и терпение!

1 Ответ

2 голосов
/ 18 февраля 2020

Я делаю обоснованное предположение о том, что вы хотите сделать, сначала давайте получим некоторые данные:

set.seed(321)
library(ggplot2)
library(dplyr)
dat = data.frame(Name=1:500,matrix(runif(500*4),ncol=4))
colnames(dat)[-1] = LETTERS[1:4]
dat$Total = rowSums(dat[,-1])

Если вы хотите рассчитать вклад A, B, C и D для каждого значение Total в двоичном формате, тогда нам нужно сделать гистограмму Total, это выглядит так, и мы сохраняем разрывы для классификации каждой строки:

his_all = hist(dat$Total,br=40)
dat$bin = cut(dat$Total,br=his_all$breaks,labels=his_all$mids)

enter image description here

В приведенном выше описании я использовал середину гистограммы, чтобы представить позицию для построения графика снова. Следовательно, есть шаг для преобразования метки фактора в цифру c. Затем нам нужно вычислить вклад A в D для каждой суммы, затем развернуть дольше и построить график:

dat %>% 
mutate_at(c("A","B","C","D"),~.x/Total) %>% 
pivot_longer(A:D) %>% 
mutate(bin=as.numeric(as.character(bin))) %>% 
ggplot(aes(x=bin,y=value,fill=name)) + 
geom_col() +
xlab("enrichment")

enter image description here

Другой способ визуализации вашего данные:

dat$interval = cut_interval(dat$Total,5)

dat %>% mutate_at(c("A","B","C","D"),~.x/Total) %>% 
group_by(interval) %>% select(c(interval,A:D)) %>% 
summarize_all(mean) %>% pivot_longer(-interval) %>%
ggplot(aes(x=interval,y=value,fill=name)) + geom_col()

enter image description here

Показывает для каждого диапазона итогов, какую долю A / B / C / D вносит в него ..

...