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/ а также с помощью этого метода: построение двух гистограмм вместе



Но я застрял, когда речь заходит о том, как наложить нормализованные данные

855   1  

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

    Ничего не найдено.