R нормализовать затем построить две гистограммы вместе в R
Я понимаю, что было несколько сообщений для людей, спрашивающих, как построить две гистограммы вместе бок о бок (как на одном графике с барами рядом друг с другом) и наложить их в R, а также о том, как нормализовать данные. Следуя совету, который я нашел, я могу сделать одну или другую операцию, но не обе.
Вот настройка.
У меня есть два фрейма данных разной длины, и я хотел бы построить объем объектов в каждом df в виде гистограммы. Например, сколько в кадре данных 1 между.1-.2 um^3 и сравните его с тем, сколько в фрейме данных 2 находятся между ними .1 и .2 гм^3 и так далее. Наложенные или бок о бок было бы здорово сделать это.
Поскольку в одном фрейме данных больше измерений, чем в другом, очевидно, что я должен нормализовать, поэтому я использую:
read.csv(ctl)
read.csv(exp)
h1=hist(ctl$Volume....)
h2=hist(exp$Volume....
#to normalize#
h1$density=h1$counts/sum(h1$counts)*100
plot(h1,freq=FALSE....)
h2$density=h2$counts/sum(h2$counts)*100
plot(h2,freq=FALSE....)
Теперь я успешно наложил ненормализованные данные, используя этот метод: http://www.r-bloggers.com/overlapping-histogram-in-r/ а также с помощью этого метода: построение двух гистограмм вместе
Но я застрял, когда речь заходит о том, как наложить нормализованные данные
1 ответ:
ggplot2позволяет относительно просто построить нормализованные гистограммы групп с неодинаковым размером. Вот пример с поддельными данными:library(ggplot2) # Fake data (two normal distributions) set.seed(20) dat1 = data.frame(x=rnorm(1000, 100, 10), group="A") dat2 = data.frame(x=rnorm(2000, 120, 20), group="B") dat = rbind(dat1, dat2) ggplot(dat, aes(x, fill=group, colour=group)) + geom_histogram(breaks=seq(0,200,5), alpha=0.6, position="identity", lwd=0.2) + ggtitle("Unormalized") ggplot(dat, aes(x, fill=group, colour=group)) + geom_histogram(aes(y=..density..), breaks=seq(0,200,5), alpha=0.6, position="identity", lwd=0.2) + ggtitle("Normalized")
Если вы хотите сделать наложенные графики плотности, вы можете сделать и это.
adjustуправляет полосой пропускания. Это уже нормализовано по умолчанию.ggplot(dat, aes(x, fill=group, colour=group)) + geom_density(alpha=0.4, lwd=0.8, adjust=0.5)
UPDATE: в ответ на ваш комментарий, следующий код должен сделать это.
(..density..)/sum(..density..)приводит к суммарной плотности по двум гистограммам сложения до одного, а общая плотность каждой отдельной группы складывается до 0,5. Таким образом, вы должны умножить на 2, чтобы общая плотность каждой группы была индивидуально нормирована к 1. В общем случае нужно умножить наn, гдеn- число групп. Это кажется довольно запутанным, и может быть более элегантный подход.library(scales) # For percent_format() ggplot(dat, aes(x, fill=group, colour=group)) + geom_histogram(aes(y=2*(..density..)/sum(..density..)), breaks=seq(0,200,5), alpha=0.6, position="identity", lwd=0.2) + scale_y_continuous(labels=percent_format())



Comments