ggplot2 tips 2
ggplot2
팁 (두번째)
- 데이터 불러오기 : 태양 흑점
library(ggplot2)
library(dplyr)
# 데이터 확인
head(sunspot.month)
## [1] 58.0 62.6 70.0 55.7 85.0 83.5
start(sunspot.month)
## [1] 1749 1
end(sunspot.month)
## [1] 2013 9
time(sunspot.month) %>% head
## [1] 1749.000 1749.083 1749.167 1749.250 1749.333 1749.417
frequency(sunspot.month)
## [1] 12
ts
형식을 데이터 프레임으로 변환하기
# 데이터 프레임으로 변환
dateStart = start(sunspot.month)
dateStart = as.Date(paste0(dateStart[1], '-', dateStart[2], '-01'))
dateEnd = end(sunspot.month)
dateEnd = as.Date(paste0(dateEnd[1], '-', dateEnd[2], '-01'))
dat = data.frame(date = seq(dateStart, dateEnd, by='1 month'),
sunspot = as.numeric(sunspot.month))
head(dat)
## date sunspot ## 1 1749-01-01 58.0 ## 2 1749-02-01 62.6 ## 3 1749-03-01 70.0 ## 4 1749-04-01 55.7 ## 5 1749-05-01 85.0 ## 6 1749-06-01 83.5
참고로 Stackoverflow에는 ts
를 data.frame
으로 변환하는 다양한 방법을 소개하고 있다. 다음은 한 예이다.
require(zoo)
dat2 = data.frame(date=as.Date(as.yearmon(time(sunspot.month))),
sunspot=as.matrix(sunspot.month))
head(dat2)
## date sunspot ## 1 1749-01-01 58.0 ## 2 1749-02-01 62.6 ## 3 1749-03-01 70.0 ## 4 1749-04-01 55.7 ## 5 1749-05-01 85.0 ## 6 1749-06-01 83.5
- 시각화
# ggplot2
ggplot(dat, aes(x=date, y=sunspot)) +
geom_point() +
geom_line()
만약 10년 단위의 x-레이블을 확인하고 싶다면,
# ggplot2
ggplot(dat, aes(x=date, y=sunspot)) +
geom_point() +
geom_line() +
scale_x_date(date_breaks = '10 years', date_labels = '%Y')
ggplot2
는 그래프 출력물에 대해 미세조정을 할 수 있다는 장점이 있지만, 수많은 함수와 인자들을 모두 외우기란 적어도 필자에게는 불가능에 가깝다. 특히나 항상 시각화를 하는 게 아니고, 필요할 때에만 한다면. 그런데 최근 1-2주 동안 정말 전처리, 시각화, EDA만 하다 보니, 뭔가 특단의 조치가 필요하다는 생각이 들었다.
위의 예처럼 ‘10년 단위의 x-레이블을 적어보고 싶다.’는 간단한 생각이지만, 이를 ggplo2
에서 구현하려면, + scale_x_date(date_breaks = '10 years', date_labels = '%Y')
를 정확하게 기억하고 있어야 한다. 하지만 어제 검색을 통해 구현을 했더라도, 오늘 다시 하려면, …
한 가지 필자가 자주 사용하는 방법은 [CTRL] + [SHIFT] + F
를 눌러서 Find in Files
를 활용하는 것이다. 동일한 프로젝트에서 위의 방법을 활용했다면 10 years
와 같은 검색어를 넣어서 금방 확인할 수 있을 것이다.
10년 단위의 x-레이블은 위처럼 글자가 서로 겹치기 때문에 아래와 같이 바꿔 주는 게 좋다.
# ggplot2
ggplot(dat, aes(x=date, y=sunspot)) +
geom_point() +
geom_line() +
scale_x_date(date_breaks = '10 years', date_labels = '%Y') +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
이런 일이 자주 반복되니 다시 한 번 더 꾀를 내게 된다. 아예 내가 잘 기억할 수 있는 짧은 구문을 만들어 버리는 것이다.
x_label_10years = function() {
scale_x_date(date_breaks = '10 years', date_labels = '%Y')
}
x_label_vertical = function() {
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
}
x_label_vertical()
의 경우, 정말 자주 활용할 수 있을 듯 하다. 하지만 x_label_10years()
는 그다지 확장성이 높지 않은 듯 하다.
ggplot(dat, aes(x=date, y=sunspot)) +
geom_point() +
geom_line() +
x_label_10years() +
x_label_vertical()
그래서 짜잔.
x_label_date = function(cycle) {
if (cycle == '10 years') {
return(scale_x_date(date_breaks = '10 years', date_labels = '%Y'))
} else if (cycle == '1 year') {
return(scale_x_date(date_breaks = '1 year', date_labels = '%Y'))
} else if (cycle == '1 month') {
return(scale_x_date(date_breaks = '1 month', date_labels = '%Y-%m'))
} else if (cycle == '1 week') {
return(scale_x_date(date_breaks = '1 week', date_labels = '%Y-%m-%d'))
} else if (cycle == '1 day') {
return(scale_x_date(date_breaks = '1 day', date_labels = '%Y-%m-%d'))
} else {
message("consider `scale_x_date(date_breaks = '1 day', date_labels='%d')` with %Y, %y, %m, %d, %H, %M, or %S")
error("cycle unknown. try x_label_date('1 day') and modify it yourself")
}
}
#ggplot(dat[1:100,], aes(x=date, y=sunspot)) +
ggplot(dat, aes(x=date, y=sunspot)) +
geom_point() +
geom_line() +
x_label_date('1 year') +
x_label_vertical() +
coord_cartesian(xlim=c(as.Date('1749-01-01'),
as.Date('1760-01-01')))
만약 필요한 형식이 조금 다르다면 x_label_date('')
로 힌트를 얻을 수 있다.
결론
ggplot() + ... +
x_label_date('1 year') +
x_label_vertical()
Leave a comment