2013-10-15 2 views
5

У меня есть следующий данныеГистограммы с переменным binwidth размера в ggplot2

dati <- read.table(text=" 
     class  num 
    1  0.0 63530 
    2  2.5 27061 
    3  3.5 29938 
    4  4.5 33076 
    5  5.6 45759 
    6  6.5 72794 
    7  8.0 153177 
    8 10.8 362124 
    9 13.5 551051 
    10 15.5 198634 
    ") 

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

bins <- c(0,4,8,11,16) 
p <- ggplot(dati) + 
    geom_histogram(aes(x=class,weight=num),breaks = bins) 

однако, это создает гистограмму, где длина каждого столбика равна общей многочисленности каждого бункера. Поскольку ширина бункера является переменной, области не пропорциональны количеству. Я не мог решить эту, по-видимому, легкую проблему в пределах ggplot2. Может кто-нибудь мне помочь?

ответ

4

I думаю Вы ищете плотность участка - this closely related question имеет большую часть ответа. Вы звоните y = ..density.. в geom_histogram().

Это работает, потому что stat_bin (напомним geom_histogram() является geom_bar() + stat_bin() и stat_bin() строит кадр данных с колоннами count и density. Таким образом, вызывая y = ..density.. тянет правую колонку для плотности, в то время как по умолчанию (отсчитывает), как если вы звоните y = ..count.. .

##OP's code 
ggplot(dati) + geom_histogram(aes(x=class, weight=num), 
breaks = bins) 

Count Histogram

##new code (density plot) 
ggplot(dati) + geom_histogram(aes(x=class,y = ..density.., weight=num), 
breaks = bins, position = "identity") 

Density Histogram

Дополнительные примеры приведены в online ggplot2 help page для geom_histogram().

+0

Спасибо большое. Это более или менее то, что я искал. Однако, поскольку мне нужно сравнивать разные группы населения, я бы хотел, чтобы общая площадь равнялась общей численности населения, а не одной. Можно ли масштабировать гистограмму? – Massimo2013

+0

Возможно, установив 'y = ..density .. * sum (.. count ..)', но я не решаюсь дать этот ответ, потому что кажется, что может быть лучший способ сделать то, что вы ищете. Новый вопрос, иллюстрирующий ваш желаемый результат, может дать вам лучший метод. –

+0

Спасибо за помощь. Я разместил [новый вопрос] (http://stackoverflow.com/questions/19397894/multiple-histograms-with-variable-size-binwidth-in-ggplot2), в котором я подробно объясняю, что мне нужно сделать – Massimo2013

0

Звучит так, как будто вы спрашиваете, как производить ширину полосы ширины переменного размера. Если да, то вам просто нужно вызвать «ширина» параметр в вашей ggplot эстетики, как это:

ggplot(data, aes(x = x, y = y, width = num)) 

этот метод подробнее обсуждается в следующем вопросе: Variable width bars in ggplot2 barplot in R

Смежные вопросы