Преобразование высоты каждого фактора на графике плотности с накоплением (ggplot2)

У меня есть ряд данных, которые показывают, как давно определенный тип элемента ДНК был активен в геноме. Это может выглядеть примерно так:

data.df <- data.frame(name=c("type1", "type1", "type1", "type2", "type2", "type2"),
                      active=c(9,11,10,21,21,18))

Таким образом, есть три элемента типа 1, активные примерно 10 лет назад, и три элемента типа 2, активные 20 лет назад.

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

ggplot(data.df, aes(x=active)) + geom_density(position="stack", aes(fill=name))

Образец сложенного участка

У меня есть информация об относительном содержании этих элементов, и я хотел бы умножить высоту плотности каждого элемента на это число. Это в конечном итоге дало бы мне фактическое изобилие активности этих элементов в геноме, а не просто распределение их активности.

Итак, мой вопрос сводится к следующему: как преобразовать/умножить высоту плотности каждого типа элемента на некоторый коэффициент, в зависимости от группы? Например, если бы у меня было 1000 элементов типа 1 в геноме и только 3 элемента типа 2, на графике плотности с накоплением преобладал бы тип 1, и вы вряд ли увидели бы кривую, связанную с типом 2.

Я надеюсь это имеет смысл. Заранее спасибо!


person David M    schedule 04.10.2013    source источник


Ответы (1)


Я не уверен, правильно ли я понял ваш вопрос, но это то, что вы хотите?

ggplot(data.df)
+geom_density(aes(x=active,y=..scaled..,fill=name),position="stack")

В справке ggplot2 под stat_density говорится, что scaled дает "оценку плотности, масштабированную до максимума 1".

В качестве альтернативы вы также можете добавить столбец веса (например, wght) в свой data.frame, использовать аргумент weight в geom_density и игнорировать предупреждающее сообщение.

data.df=data.frame(name=c("type1","type1","type1","type1","type1","type1","type2", "type2","type2"),active=c(1.1,1,1,1,1,1,17.1,17,17),stringsAsFactors =FALSE)
data.df=within(data.df,wght<-c(rep(1/6,6),rep(4/9,3)))

ggplot(data.df)+
geom_density(aes(x=active,y=(..density..),fill=name,weight=wght),position="stack")

Однако я точно не знаю, как geom_density обрабатывает веса, сумма которых не равна 1.

person cryo111    schedule 04.10.2013
comment
Весы были именно то, что я искал. ..scaled.. масштабирует все кривые так, чтобы они имели максимальную высоту 1, что делает более широкие диапазоны распределения/активности искусственно завышенными. Спасибо! - person David M; 05.10.2013