2017-12-18 20 views
1

ggplot2 상자 그림에서 Y 축 위로 시간을 표시하는 데 어려움을 겪고 있습니다.ggplot2의 y- 축 레이블로 사용 된 시간

y 축을 시간으로 표현할 수있는 아이디어가 있습니까?

현재 Y 축은 숫자이며 계열에 날짜 레이블이 적용됩니다.

내가 시간을 표시하는 것을 선호 : 대신에 모든 데이터를 보여주는에, Y 축에 (HH MM하는) 레이블

내 데이터 :

structure(list(Date = structure(c(17511, 17512, 17513, 17514, 17515), class = "Date"), 
T.min = c(1513584134, 1513580301, 1513582918, 1513583058, 1513584465), 
T.mean = c(1513585975.14286, 1513584408.14286, 1513584580.57143, 1513583202.2, 1513585681), 
T.max = c(1513587691, 1513587419, 1513585508, 1513583516, 1513587100), 
min_labels = c("08:02", "06:58", "07:41", "07:44", "08:07"), 
mean_labels = c("08:32", "08:06", "08:09", "07:46", "08:28"), 
max_labels = c("09:01", "08:56", "08:25", "07:51", "08:51")), .Names = c("Date", "T.min", "T.mean", "T.max", "min_labels", "mean_labels", "max_labels"), row.names = c(NA, -5L), class = "data.frame") 

내 플롯 (y 축과 플롯 값) POSIXct 형식으로되어 있습니다 :

#Library 
library(ggplot2) 
library(scales) 

#Plot 
theme_set(theme_bw()) 
ggplot(df, aes(x = Date)) + 
    geom_boxplot(aes(ymin = T.min, lower = T.min, middle = T.mean, upper = T.max, ymax = T.max), 
      stat = "identity", fill = "antiquewhite", color = "black") + 
    geom_line(aes(x=Date, y=T.mean),color='firebrick2', size=3, show.legend = FALSE) + 
    xlab('Shift Start Date') + 
    ylab('Time') + 
    coord_cartesian(ylim =c(Y.min, Y.max)) + 
    scale_x_date(date_labels = "%d-%b", breaks = pretty_breaks(5)) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    theme(axis.text.y = element_blank()) + 
    geom_text(aes(x=Date, y = T.min, label = min_labels), size=5, vjust=1.5, check_overlap=TRUE) + 
    geom_text(aes(x=Date, y = T.mean, label = mean_labels), size=5, vjust=-0.5, check_overlap=TRUE) + 
    geom_text(aes(x=Date, y = T.max, label = max_labels), size=5, vjust=-1.5, check_overlap=TRUE) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) 

Current plot output

내가 목표로하고있어 (MS Paint에 추가 된 라벨은 데이터와 잘 어울리지 않지만 내가 원하는 것을 볼 수 있습니다.) What I'm aiming for

+0

y 축은 어떻게 생겼을 까? – Jimbou

+0

설명해 주실 수 있습니까? "Y 축 레이블 숨기기 .... Y 축 레이블 표시 및 최소 및 최대 데이터 레이블 숨기기" – PoGibas

+0

질문에 대한 답변을 드리겠습니다. 게시물을보다 명확하게 편집했습니다. 많은 감사합니다! – Jernau

답변

1

여기가 제 시도입니다. 15135840002017-12-18 08:00:00 GMT 인 경우 2017 년 12 월 18 일 06:00에서 10:00 사이에 30 분마다 값이 발견되었습니다.이 숫자는 nums에 저장됩니다.

nums <- seq(from = 1513584000 - 7200, to = 1513584000 + 7200, length.out = 9) 

[1] 1513576800 1513578600 1513580400 1513582200 1513584000 1513585800 1513587600 1513589400 
[9] 1513591200 

그럼, 날짜 개체에 nums를 변환 format()를 사용하여 시간과 분을 추출 하였다. 이것은 내가 y 축에 대한 새로운 레이블을 가질 수있게 해준다. 그들은 labels에 저장됩니다.

labels <- as.POSIXct(nums, origin = "1970-01-01", tz = "GMT") %>% 
      format("%H:%M") 

# [1] "06:00" "06:30" "07:00" "07:30" "08:00" "08:30" "09:00" "09:30" "10:00" 

제가 scale_y_continuous()를 사용하여 Y 배율을 바꾸었다. limits 인수의 최소값과 최대 값을 nums으로 설정했습니다.

g <- ggplot(df, aes(x = Date)) + 
    geom_boxplot(aes(ymin = T.min, lower = T.min, middle = T.mean, upper = T.max, ymax = T.max), 
        stat = "identity", fill = "antiquewhite", color = "black") + 
    geom_line(aes(x=Date, y=T.mean),color='firebrick2', size=3, show.legend = FALSE) + 
    xlab('Shift Start Date') + 
    ylab('Time') + 
    ylim(c(min(df$T.min)-1800, max(df$T.max)+ 1800)) + 
    scale_x_date(date_labels = "%d-%b", breaks = pretty_breaks(5)) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    geom_text(aes(x=Date, y = T.min, label = min_labels), size=5, vjust=1.5, check_overlap=TRUE) + 
    geom_text(aes(x=Date, y = T.mean, label = mean_labels), size=5, vjust=-0.5, check_overlap=TRUE) + 
    geom_text(aes(x=Date, y = T.max, label = max_labels), size=5, vjust=-1.5, check_overlap=TRUE) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    scale_y_continuous(breaks = nums, labels = labels, limits = c(nums[1], nums[length(nums)])) 

enter image description here

+0

@Jernau 나는 나의 대답을 업데이트했다. 나는 이것이 당신을 돕기를 바랍니다. – jazzurro

+0

도움을 주셔서 감사합니다. 나는 ggplot2에 익숙하지 않으며 이것은 정말로 도움이됩니다. – Jernau

+0

@Jernau 전에이 일을 해본 적은 없기 때문에 나에게는 좋은 학습 기회였습니다. 돌아 다니는 더 좋은 방법이있을 수 있습니다. 하지만이 방법이 효과적입니다.사례가 완료되면 위/아래 투표 삼각형 옆에있는 녹색 체크를 클릭하고 질문을 닫으십시오. – jazzurro

1

@Jazzurro에게 감사드립니다. 접근 방식은 작은 비틀기와 함께, 축이

최종 출력 (추가 데이터 레이블 이제 숨길 수) 더 플롯에서 다시 사용 The Final Output

'최종'코드를 쉽게 수정할 수 수, 제안 나는 다음과 같이 정착했다 :

#Define Y-axis range (use half hour steps) in both POSIXct and numeric forms 
Y.minT <- as.POSIXct("06:00:00" , format = "%H:%M:%S") 
Y.maxT <- as.POSIXct("12:00:00" , format = "%H:%M:%S") 
Y.min <- as.numeric(Y.minT) 
Y.max <- as.numeric(Y.maxT) 

#Create the axis breaks 
nums <- seq(from = Y.min, to = Y.max, length.out = 1+abs(2 * difftime(Y.maxT, Y.minT)[[1]])) 

#Create a vector of date labels 
labels <- as.POSIXct(nums, origin = "1970-01-01", tz = "GMT") %>% format("%H:%M") 

#Changed the y-axis as suggested, specifying 'breaks', 'labels' and 'limits' 
# scale_y_continuous(breaks = nums, labels = labels, limits = c(Y.min, Y.max)) 

#Plot 
theme_set(theme_bw()) 
ggplot(df, aes(x = Date)) + 
    geom_boxplot(aes(ymin = T.min, lower = T.min, middle = T.mean, upper = T.max, ymax = T.max), 
      stat = "identity", fill = "antiquewhite", color = "black") + 
    geom_line(aes(x=Date, y=T.mean),color='firebrick2', size=3, show.legend = FALSE) + 
    xlab('Date') + 
    ylab('Time') + 
    scale_x_date(date_labels = "%d-%b", breaks = pretty_breaks(5)) + 
    scale_y_continuous(breaks = nums, labels = labels, limits = c(Y.min, Y.max)) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    theme(axis.text=element_text(size=15), axis.title=element_text(size=15,face="bold")) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
    #geom_text(aes(x = Date, y = T.min, label = min_labels), size=5, vjust=1.5, check_overlap=TRUE) + 
    #geom_text(aes(x=Date, y = T.max, label = max_labels), size=5, vjust=-1.5, check_overlap=TRUE) + 
    geom_text(aes(x=Date, y = T.mean, label = mean_labels), size=5, vjust=-0.5, check_overlap=TRUE) 
+0

당신을 만나서 반갑습니다. 목표를 달성했습니다. :) – jazzurro