2017-02-16 13 views
2

я столкнулся следующим сценарий ...Гистограмма binwidth (в) соответствие между базовой графикой и ggplot2

Следующий код производит 2 идентичной гистограмму:

library(ggplot2) 
data("diamonds")  
ggplot(diamonds, aes(x=price)) + geom_histogram(binwidth=1000) 
qplot(price, data = diamonds, binwidth = 1000) 

Однако, я не понимаю, как они выводят первый бар/бин слева, на самом деле вся гистограмма кажется мне неправильной. enter image description here

С другой стороны:

hist(diamonds$price,breaks = seq(0,20000, by=1000)) 

производит следующий график, который кажется мне правильным: enter image description here

Для проверки достоверности данных, я побежал этот код:

br = seq(0,20000,by=1000) 

ranges = paste(head(br,-1), br[-1], sep=" - ") 
freq = hist(diamonds$price, breaks = br, include.lowest=TRUE, plot=FALSE) 

data.frame(range = ranges, frequency = freq$counts) 

и производит:

  range frequency 
1  0 - 1000  14524 
2 1000 - 2000  9683 
3 2000 - 3000  6129 
4 3000 - 4000  4225 
5 4000 - 5000  4665 
... 

Итак, откуда эта первая балка/корзина в ggplot или qplot?

ответ

2

Гистограммы ggplot сосредоточены на 0, 1000, 2000 и т. Д., Тогда как бары базовой гистограммы центрированы на 500, 1500, 2500 и т. Д. Чтобы проверить это, сравните количество баров в каждой гистограмме с подсчетом таблицы где мы устанавливаем разрывы явно.

table(cut(diamonds$price, breaks=seq(-500,20000,1000))) 
(-500,500]  (500,1.5e+03] (1.5e+03,2.5e+03] (2.5e+03,3.5e+03] (3.5e+03,4.5e+03] 
     1749    18261    7532    4958    4535 
etc. 
theme_set(theme_classic()) 
ggplot(diamonds, aes(x=price)) + 
    geom_histogram(binwidth=1000, fill="grey80", colour="black", lwd=0.2) + 
    stat_bin(binwidth=1000, geom="text", aes(label=..count..), 
      position=position_stack(vjust=0.5), size=3) 

enter image description here

И для базовой гистограммы:

freq = hist(diamonds$price)$counts 
tab = unname(table(cut(diamonds$price, breaks=seq(0,19000,1000)))) 

cbind(freq, tab) 
 freq tab 
[1,] 14524 14524 
[2,] 9683 9683 
[3,] 6129 6129 
[4,] 4225 4225 
[5,] 4665 4665 
[6,] 3163 3163 
[7,] 2278 2278 
[8,] 1668 1668 
[9,] 1307 1307 
[10,] 1076 1076 
[11,] 934 934 
[12,] 825 825 
[13,] 701 701 
[14,] 603 603 
[15,] 504 504 
[16,] 513 513 
[17,] 425 425 
[18,] 405 405 
[19,] 312 312 

Чтобы получить те же разрывы в ggplot гистограмме, вы можете использовать center аргумент в дополнение к binwidth:

ggplot(diamonds, aes(x=price)) + 
    geom_histogram(binwidth=1000, center=500, fill="grey80", colour="black", lwd=0.2) + 
    stat_bin(binwidth=1000, center=500, geom="text", aes(label=..count..), 
      position=position_stack(vjust=0.5), size=3) 

enter image description here

+0

Спасибо @ eipi10. Однако, похоже, что ggplot всегда находится на 0 для первого бара. Если я это сделаю: ggplot (алмазы, aes (x = цена)) + geom_histogram (binwidth = 500), график начинается с 0 (в центре на 250). Это не кажется последовательным, есть ли причина этого? – Perceptron

+1

Когда я устанавливаю 'binwidth = 500', первый бит центрируется на 500 и идет от 250 до 750. Я точно не знаю, как работает алгоритм установки ggplot bin, но он пытается центрировать бит на ноль если есть хотя бы одно значение в ячейке с центром в нуле (учитывая любую ширину бина, которую пользователь выбирает, или бинарность по умолчанию (которая рассчитана по умолчанию по 30 бункеров) в противном случае). – eipi10

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

  • Нет связанных вопросов^_^