2016-08-29 7 views
2

ggplot2을 사용하여 시계열 데이터를 플로팅 할 수 있습니다. 그러나 계절별 정보와 함께 시계열 데이터를 강조하고 싶습니다. 내가 시계열 데이터를 그릴 수 있어요시계열 데이터의 여러 x 축 레이블

library(zoo) 
library(ggplot2) 

a <- read.table(text = " 
     Season Quarter Sales 
     Season1 2014Q1 20 
     Season1 2014Q2 40 
     Season1 2014Q3 60 
     Season1 2014Q4 80 
     Season2 2015Q1 30 
     Season2 2015Q2 40 
     Season2 2015Q3 80 
     Season3 2015Q4 90 
     Season3 2016Q1 100 
     Season3 2016Q2 120 
     Season3 2016Q3 140 
    ", header = TRUE, sep = "") 
a$Quarter<-as.yearqtr(a$Quarter) 
a$Quarter<-as.Date(a$Quarter) 

ggplot(data=a,aes(x=Quarter, y=Sales)) + 
     geom_line() 

이 점에서 잘 작동 :

여기 내 코드입니다. plot1

지금, 나는 시즌 1을, color 또는 linetype을 사용하는 것이 작업을 수행하는 2 등 한 가지 방법을 구성하는 것에 레이블을합니다. 그러나 이것은 시계열의 연속성을 깨기 때문에 효과가없는 것처럼 보입니다. 한편

plot2

# doesn't work... 
ggplot(data=a,aes(x=Quarter, y=Sales)) + 
     geom_line(aes(linetype=Season)) 

는, 내가 좋아하는 방법 Excel에서 플롯 두 번의 클릭이 그래프. 날짜와 함께 x 축에 계절 정보를 보여주는 아름다운 그래프를 만듭니다. 기본적으로 3 층 x 축을 만듭니다.

질문 1 : 나는이 주제에 대한 두 가지 질문이

plot3

내가 ggplot에서 linetype (또는 color)이 연속 그래프를 만드는 데 사용할 수있는 방법ggplot 사용을, (즉, 휴식없이)? linetype (color)을 선호합니다. 예를 들어 설명에 답하기 위해 다음은 다른 데이터 집합을 사용하여 만든 그래프입니다.

df <- data.frame(x = 1:3, y = 1:3, z = c(1,3,5)) 
ggplot(df, aes(x, y, color = factor(z))) + 
     geom_line(aes(group = 1)) 

나는 시계열 데이터에 대한 위의 동작을 복제 할 수 없습니다.

enter image description here

질문 2 : ggplot를 사용, 나는 (Excel이 나에게했던 것과 유사) 멀티 레벨 x 축을 만드는 방법을 계절을 보여줍니다 여기에 내가 코드 위에서 얻은 그래프이다 날짜 정보? {내가 만든 Excel 그래프를보십시오.}이 옵션을 사용하여 범례를 만들고 싶지 않습니다. 또한 x3 값과 y 값을 조정하고 다시 조정하여 다중 레벨 레이블을 넣는 해킹 방법을 annotate (또는 가능하게는 geom_text) 방법으로 적용하여 해킹 방법을 사용하지 않으면 감사 하겠음을 분명히 밝힙니다. 이는 프로그래밍 언어를 사용하여 그래프를 그리는 목적을 상쇄하고 데이터가 변경되면 작동하지 않기 때문입니다.

질문 사항이 있으면 알려 주시기 바랍니다. 나는 네 생각을 고맙게 생각한다. 저는 ggplot2으로 절대적인 초보자입니다. Excel 및 STATA에서 ggplot으로 전환 한 지 불과 5 일 밖에되지 않았습니다. 그래서 내 질문이 너무 근본적이라면 사과드립니다.

나는이 주제를 SO에서 연구 했으므로 충분히 근접 할 수는 없다. 예를 들어 this thread은 틱을 변경하는 것에 대해 이야기하지만 내가 찾고있는 것은 아닙니다.

+0

의도가 분명하지만, 당신의'linetype' 예를 들어, 특히,'ggplot2'가 옳은 일을하고있다 - 예를 들어, 어떤'linetype' 당신에게 것 시즌 1과 2를 연결하는 세그먼트가있을 것으로 기대하십니까? – tchakravarty

+0

@ tchakravarty 귀하의 의견에 감사드립니다. 이제는 색상을 사용하여 연속성을 보여줄 수 있다면 도움이 될 것이라고 생각합니다. 나는 위의 설명을 추가 할 것이다. – watchtower

+0

동일한 논리가 색상에도 적용됩니다. 최선의 방법은 Excel이 당신을 위해 만드는 계층 적 축을 시도하고 복제하는 것입니다. 여기에 몇 가지 이전 솔루션이 있습니다 [여기] (http://stackoverflow.com/q/18165863/1414455) 및 [여기] (http://stackoverflow.com/q/5704725/1414455). – tchakravarty

답변

2

당신은 아주 쉽게이 같은 엑셀 플롯의 의도을 다시 만들 수 있습니다 : 행의 휴식을위한

library(plyr) 
ss <- ddply(a, .(Season), summarize, date = min(Quarter)) 
ss$date <- as.numeric(ss$date) 

ggplot(data=a,aes(x=Quarter,y=Sales)) + 
    geom_line() + 
    geom_vline(data = ss, aes(xintercept = date), colour = "grey50") + 
    geom_text(data = ss, aes(x = as.Date(date), y = Inf, label = Season), 
      hjust = -0.1, vjust = 1.1) 

enter image description here

한 가지 해결 방법 연속 회색 선을 그릴 색상을한다 사용하는 경우 컬러 라인 외에도 :

ggplot(data=a,aes(x=Quarter,y=Sales)) + 
    geom_line(colour = "grey80") + 
    geom_line(aes(colour = Season)) + 
    geom_vline(data = ss, aes(xintercept = date), colour = "grey50") + 
    geom_text(data = ss, aes(x = as.Date(date), y = Inf, label = Season), 
      hjust = -0.1, vjust = 1.1) 

enter image description here

1

해결 방법은 Season 열에 변경 사항이있을 때 데이터 프레임을 수정하는 것입니다. 즉, 데이터 프레임에 추가 행을 추가하는 것입니다. 이 방법처럼 :

library("plyr") 

# add additional lines at end of every season 
tmp <- ddply(a, "Season", 
      function(x) { 
       x[nrow(x)+1, "Season"] <- x[nrow(x), "Season"] 
       x 
      }) 
# fill NA values with values of next season 
tmp$Quarter <- na.locf(tmp$Quarter, fromLast=TRUE, na.rm=FALSE) 
tmp$Sales <- na.locf(tmp$Sales, fromLast=TRUE, na.rm=FALSE) 
tmp <- na.omit(tmp) # drop last line 
tmp 
#  Season Quarter Sales 
# 1 Season1 2014-01-01 20 
# 2 Season1 2014-04-01 40 
# 3 Season1 2014-07-01 60 
# 4 Season1 2014-10-01 80 
# 5 Season1 2015-01-01 30 
# 6 Season2 2015-01-01 30 
# 7 Season2 2015-04-01 40 
# 8 Season2 2015-07-01 80 
# 9 Season2 2015-10-01 90 
# 10 Season3 2015-10-01 90 
# 11 Season3 2016-01-01 100 
# 12 Season3 2016-04-01 120 
# 13 Season3 2016-07-01 140 

ggplot(data=tmp, aes(x=Quarter, y=Sales)) + 
     geom_line(aes(colour=Season, linetype=Season)) 

ggplot output