2014-10-29 4 views
1

ggplot2를 사용 중이고 bin 순서를 변경하려고합니다. 나는 뉴욕의 Stop and Frisk 프로그램을 위해 여기에있는 데이터를 사용하고있다 : http://www.nyclu.org/content/stop-and-frisk-datageom_histogram에서 bin 순서를 변경 하시겠습니까?

시간은 정수 (예 : 5 = 12:05 AM, 355 = 3:55 AM, 2100 = 9 PM)로 주어진다. 6 AM, 6 -

는 내가이 쓰레기통, 자정-3 시부 터 오전 3시을가는,이 나에게 시간의 상당히 좋은 그래프를 준

myplot <- ggplot(Stop.and.Frisk.2011) + geom_histogram(aes(x=timestop),binwidth=300) 

정지의 시대의 히스토그램을 작성하려면 다음을 사용 오전 9시 등

그러나 정상적인 작업 일을 더 시뮬레이션하려면 처음 두 개의 저장소 (자정 - 오전 3시 및 오전 6시 - 오전 9시)를 끝까지 옮기고 싶습니다.

빈의 순서를 변경하는 간단한 방법이 있습니까? 나는 breaks 함수를 사용해 보았지만 돌아 다니는 방법을 찾을 수 없다.

본질적으로, 빈은 600-900, 900-1200, 1200-1500, 1500-1800, 1800-2100, 2100-2400, 0-300, 300-600 순으로해야합니다.

미리 감사드립니다.

답변

0

한 가지 방법은 ggplot을 호출하기 전에 데이터를 저장하는 것입니다.

# Load ggplot2 for plotting 
library(ggplot2) 

# Read in the data 
df <- read.csv('SQF 2012.csv', header = TRUE) 

# Create intervals every 3 hours based 
# on the `timestop` variable 
df$intervals <- cut(df$timestop, 
        breaks = c(0, 300, 600, 
           900, 1200, 1500, 
           1800, 2100, 2400)) 

# Re-order the sequence prior to plotting 
df$sequence <- ifelse(df$intervals == '(600,900]', 1, NA) 
df$sequence <- ifelse(df$intervals == '(900,1.2e+03]', 2, df$sequence) 
df$sequence <- ifelse(df$intervals == '(1.2e+03,1.5e+03]', 3, df$sequence) 
df$sequence <- ifelse(df$intervals == '(1.5e+03,1.8e+03]', 4, df$sequence) 
df$sequence <- ifelse(df$intervals == '(1.8e+03,2.1e+03]', 5, df$sequence) 
df$sequence <- ifelse(df$intervals == '(2.1e+03,2.4e+03]', 6, df$sequence) 
df$sequence <- ifelse(df$intervals == '(0,300]', 7, df$sequence) 
df$sequence <- ifelse(df$intervals == '(300,600]', 8, df$sequence) 
df$sequence <- as.numeric(df$sequence) 

# Create the plot 
ggplot(df, aes(x = sequence)) + 
    geom_histogram(binwidth = 0.5) + 
    scale_x_continuous(breaks = c(1, 2, 3, 4, 5, 6, 7, 8), 
        labels = c('6AM-9AM', '9AM-12PM', '12PM-3PM', '3PM-6PM', 
           '6PM-9PM', '9PM-12AM', '12AM-3AM', '3AM-6AM')) + 
    xlab('Time') + 
    ylab('Number\n') + 
    theme(axis.text = element_text(size = rel(1.1))) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    theme(axis.title = element_text(size = rel(1.1), face = 'bold')) 

Output

+0

정말 고마워요,이게 내가 찾던 정확히! –

0

여기 한 방법이다 : 여기에 3 시간 간격을 생성 할 cut 함수를 사용하는 예이다. 0에서 599 사이의 모든 타임 스탬프 값에 2400을 추가했습니다.이 방법으로 원하는 시간 범위를 그래프의 끝 (즉, 오른쪽)으로 옮겼습니다. 그래픽을 그렸을 때 x 축을 수정했습니다.

library(data.table) 
library(dplyr) 

# Read the file 
foo <- fread("SQF 2012.csv", header = TRUE, na.strings="NA", colClasses="character") 

# Change timestop values 
ana <- setDF(foo) %>% 
     select(datestop,timestop) %>% 
     mutate(timestop = as.numeric(timestop), 
       timestop = ifelse(timestop >= 0 & timestop < 600, 2400 + timestop, timestop)) 

# Draw the graph 
ggplot(data = ana, aes(x = timestop)) + 
    geom_histogram() + 
    scale_x_continuous(limit = c(600, 3000), 
         breaks = c(600, 900, 1200, 1500, 
            1800, 2100, 2400, 2700, 3000), 
         labels = c("6:00", "9:00", "12:00", "15:00", 
            "18:00", "21:00", "24:00", "3:00", "6:00")) + 
    xlab("Time") 

enter image description here

+0

도움을 주셔서 대단히 감사드립니다! –

관련 문제