2017-05-18 3 views
1

날짜 열이있는 데이터 프레임의 산점도를 생성하고 싶습니다. x 축은 매월 나누어 져야하며, 지난 2 년 동안 매 2 개월마다 이루어져야합니다.분산 형 플롯 (R)에서 날짜 x- 축 정의하기

dataframe :

code_1000 <- 
    as.data.frame(cbind(
    c("3", "3", "7", "7", "7", "7", "2", "2", "4", "4"), 
    c("344", "344", "73", "73", "71", "72", "21", "27", "42", "43"), 
    c("9-02-2017", "10-01-2016","9-02-2014", "25-03-2015", "9-02-2017", 
     "10-06-2017", "8-04-2017", "25-08-2016", "07-08-2017", "15-09-2016" 
    ) 
)) 
names(code_1000) <- c("number", "code", "date") 

플롯 코드 : 나는 x 축에서 y 축에 codedate을 플롯 할

qplot(data=code_1000, 
     x=format(as.Date(date),"%b/%Y"), 
     y=code, 
     geom=c("point"), 
     na.rm=TRUE, 
     xlab="Emission date", ylab="Code", 
     size=1, col=2)+theme_bw()+theme(legend.position="none") 

. x 축을 월별로 나누려면 어떻게합니까? 또한 플로팅 코드를 실행할 때 x 축 형식은 mm/dddd와 비슷하지만 mm/yyyy를 원합니다. 왜 그 형식을 얻는거야?

샤이니 앱에서 ~50 데이터 프레임 (code_1000)이 있습니다. 일을 더 간단하게하기 위해 모든 코드를 공유하지는 않습니다.

미리 감사드립니다.

답변

1

기본 날짜 분석기가 DD-MM-YYY 표기법으로 혼란 스럽다고 생각합니다. 당신이 lubridate과 날짜를 구문 분석하는 경우 (아마도 마이너/메이저 원하는 틱하지에 있습니다.) 는, x 축은 더 합리적 보이는

나는 qplot 내부의 날짜의 당신의 재 포맷을 제거하고 스케일링 기능을 추가 . lubridate에서 내 시도가 작동 실패를 제외하고

library(lubridate) 
library(scales) 

# implicit in poster's question 
library(ggplot2) 

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

qplot(
    data = code_1000, 
    x = date, 
    y = code, 
    geom = c("point"), 
    na.rm = TRUE, 
    xlab = "Emission date", 
    ylab = "Code", 
    size = 1, 
    col = 2 
) + theme_bw() + theme(legend.position = "none") + scale_x_date(
    date_breaks = "1 year", 
    date_minor_breaks = "1 month", 
    labels = date_format("%m-%Y") 
) 

enter image description here

0

내 솔루션은 위의 @MarkMiller와 매우 유사 끝났다. 대신 strptime을 사용하여 날짜를 변환했습니다.

code_1000$date <- strptime(code_1000$date, format = "%d-%M-%Y") 

도 나는 ggplot 기능을 대신 qplot의,보다 유연하고 간결로 찾을 수 있습니다. 반짝이는 응용 프로그램의 내부, 특히, qplot 변수 결과를 얻을 수있다 (?) :

library(tidyverse) 
library(scales) # needed for date_format() 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + 
    theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m/%Y")) 

당신이 빛나는 플롯에 걸쳐 일관되게 한계를 설정하려면, 설정 한 특정 시간 제한 :

limits <- strptime(c("01-01-2014", "01-01-2018"), format = "%d-%m-%Y") 
ggplot(code_1000, aes(date, code)) + 
    geom_point(size=2, col="steelblue") + theme_bw() + 
    labs(x="Emission Date", y="Code") + 
    scale_x_datetime(labels = date_format("%m-%Y"), #minor_breaks = "1 month" 
        date_breaks = "1 year", limits = as.POSIXct(limits)) 
+0

답변 해 주셔서 감사합니다. 매트! code_1000 $ date <- strptime (code_1000 $ date, format = "% d- % M- % Y")을 실행할 때 날짜 열은 이되었습니다. 왜 그런 일이 일어나는 지 아십니까? 다시 한번 감사드립니다. –

+0

나는이 페이지에서 복사 한 모든 것을 사용하여 그 시점까지 기본 패키지만으로는 잘 작동한다. R을 다시 시작하고 패키지를로드하지 마십시오. 아마도 패키지 함수와 충돌 할 수 있습니까? 나는 플롯에 필요한 패키지를 포함하도록 내 대답을 수정했다. –

0

감사합니다 당신의 대답 녀석을 위해 대단히!

Shiny에서 내 데이터 프레임에이 날짜 형식을 적용하는 데 어려움이 있습니다.

하나의 데이터 프레임 code_1000 대신에 code_1000에서 code_1050까지 51 개의 다른 데이터 프레임이 있습니다. 나는 그 dataframes의 모든 date 열을이 일자 포맷

code_1000$date <- lubridate::dmy(as.character(code_1000$date)) 

을 적용하고 싶습니다. for을 사용하여 작업하려했지만 혼란스럽고 일이별로 없었습니다.input$code.numbers가 (1000 1050)를 dataframes이라는 숫자를 포함하는 dataframe가

for (m in 1:nrow(input)){ 

    assign(paste0("code_",input$code.numbers[m])$date, lubridate::dmy(as.character(eval(parse(text=paste0("code_",input$code.numbers[m])))$date))) 

    } 

. 내가 R에 lapply()은 대부분의 시간의 쉬운 접근이라고 읽고,이 사용 forlapply() 기능을 수행하는 방법을 배우고 싶은

Error in paste0("code_",input$code.numbers[m])$date : 
    $ operator is invalid for atomic vectors 

: 나는 다음과 같은 오류가 발생했습니다.

+0

이 질문은 다른 질문으로 게시 할 수도 있습니다. 원본과 많이 다르므로 ...이 유형 문제에 대해 purr :: map 함수를 사용하는 방법을 배우려고합니다. 변수를 제외하고 모두 거의 동일하면 세로 형식 데이터 프레임으로 병합하여 작업하기가 더 쉽습니다. 대답 할 정보가 더 필요하다. –

관련 문제