2015-09-24 6 views
0

http://imgur.com/IfVyu6fЧто это за тип графика и как его нарисовать в R?

Я думал, что это будет нечто, называемое кумулятивным, и нашло бы кумулятивный график частоты и кумулятивную блок-схему. Тем не менее, я не думаю, что ни один из них не является графиком на изображении, потому что кумулятивные графики начинаются с 0, но мои переменные этого не делают. Кроме того, графики плотности кажутся самыми близкими, но это распределение по площади 1, но я хочу показать частоты.

В основном переменные являются составной частью основной переменной, и я хочу показать, когда эти подпеременные сходятся, чтобы создать пик. По сути, эти переменные суммируются, чтобы показать кумулятивную границу.

+0

Это называется ** стек область ** диаграмма , См. Этот ответ здесь: http://stackoverflow.com/questions/4651428/making-a-stacked-area-plot-using-ggplot2 – neerajt

+0

Спасибо. Кажется, это очень близко к тому, что мне нужно. Но вместо плотности мне нужна ось Y для отображения частот. –

+0

Возможно, это может помочь http://stackoverflow.com/questions/18519243/ggplot-legend-key-color-and-items – Keniajin

ответ

1

Спасибо за обмен немного больше о том, что выглядят ваши данные как.

В качестве примера воспользуемся общедоступными данными статистики преступлений из Департамента полиции Хьюстона. В этом случае мы используем набор данных в течение месяца января, 2015.

library(ggplot2) 

crime <- gdata::read.xls('http://www.houstontx.gov/police/cs/xls/jan15.xls') 

# There's a single case in there where the offense type is called '1', 
# that doesn't make sense to us so we'll remove it. 
crime <- crime[!crime$Offense.Type == '1', ] 
crime$Offense.Type <- droplevels(crime$Offense.Type) 

Есть 10 колонок, но те из них мы находимся заинтересованы в выглядеть следующим образом:

# Hour Offense.Type 
# 8 Auto Theft 
# 13 Theft 
# 5 Auto Theft 
# 13 Theft 
# 18 Theft 
# 18 Theft 

Как вы упомянули, проблема в том, что каждая строка является единственным инцидентом. Нам нужен способ получить частоты в час, чтобы пройти до geom_area().

Первый способ - позволить ggplot2 обрабатывать его, нет необходимости предварительно форматировать данные.

p <- ggplot(crime, aes(x=Hour, fill=Offense.Type)) 
p + geom_area(aes(y = ..count..), stat='density') 

ggplot density method

Другой способ заключается в предварительно отформатированные таблицы частот, используя R-х table() и reshape2-х melt():

library(reshape2) 
crime.counts <- table(crime$Hour, crime$Offense.Type) 
crime.counts.l <- melt(crime.counts, 
         id.vars = c('Hour'), 
         value.name = "NumberofCrimes") 

names(crime.counts.l) <- c("Hour", "Offense.Type", "numberOfCrimes") 
p <- ggplot(crime.counts.l, aes(x = Hour, 
           y = numberOfCrimes, 
           fill = Offense.Type)) 
p + geom_area() 

preformatted table method

+0

СПАСИБО СМОТРЕТЬ! Это именно то, что я искал. У меня есть еще один вопрос. Скажем, я хочу просто построить данные для трех типов: «Aggrevated Assault», «Murder», «Rape». Как мне это достичь? –

+0

[См. Этот ответ здесь] (http://stackoverflow.com/questions/1195826/drop-factor-levels-in-a-subsetted-data-frame). Посмотрите на второй ответ (а не на флажок). Короткий ответ - вы хотите использовать подмножество и капли. ** subset() ** делает то, что вы ожидаете, и ** droplevels() ** избавляется от неиспользуемых меток, чтобы они не попадали в легенду сюжета или каким-то образом его испортили. – neerajt

1

Использование ggplot2 вы можете использовать функцию geom_area()

library(ggplot2) 
library(gcookbook) # For the data set 

ggplot(uspopage, aes(x=Year, y=Thousands, fill=AgeGroup)) + geom_area() 
+0

Могу ли я спросить, для чего используется gcookbook? Если бы мне пришлось использовать ggplot2, я должен был бы «library (ggplot2)», и я должен был бы использовать ggplot и geom_area, правильно? –

+0

уверен, что 'gcookbook' содержит наборы данных, используемые в книге« R Graphics Cookbook »Уинстона Чанга. Я использовал его для получения данных 'uspopage' – Keniajin

+0

В этом случае' uspopage', похоже, уже имеет табуляцию по частоте. Мои данные не имеют уже рассчитанной частоты. Таким образом, я попытался сделать новый столбец с 1 и использовать func.y = sum, но кажется очень взломанным. Есть ли способ использовать ggplot для данных, которые не имеют столбца частоты? –