grid package로 그림 그리기

Gallery

R로 야경을 그려보고, 한 낮의 풍경을 그려보겠다. 동심으로 돌아가 하얀 스케치북에 그레파스를 이용해서 산도 그리고, 달고 그리고, 별과 해도 그려보자. 밤의 그림은 Paul Murrell가 그렸고, 필자가 Paul Murrell의 스케치북과 그레파스를 빌려서 모사해보겠다. 해가 중천에 걸린 여름 산은 녹음이 우거져 있다.

유충현
2016-01-02

오클랜드 대학교의 Paul Murrell은 grid라는 이름의 그래픽 라이브러리(package)를 개발했다. 이 라이브러리가 바로 latticeggplot2 package의 토대가 된다.

grid package를 이용해여 멋진 풍경을 그려보자. ‘R로도 그림을 그릴 수 있겠구나’하는 흥미차원의 시도다.

먼저 야경을 그려보고, 한 낮의 풍경을 그려보겠다. 동심으로 돌아가 하얀 스케치북에 그레파스를 이용해서 산도 그리고, 달고 그리고, 별과 해도 그려보자. 밤의 그림은 Paul Murrell가 그렸고, 필자가 Paul Murrell의 스케치북과 그레파스를 빌려서 모사해보겠다. 해가 중천에 걸린 여름 산은 녹음이 우거져 있다.

R로 그린 밤 하늘의 풍경

아마 Paul Murrell는 검은색과 회색 크레파스가 다 떨어졌을 것이고, 필자는 하늘색 크레파스가 다 달아 없어졌다. Paul Murrell이 그린 밤 하늘의 풍경이다.

library(grid)

# 도화지를 준비했다
pushViewport(viewport(xscale = c(0, 1), yscale = c(0.5, 1),
                      clip = TRUE))   
             
# 검은색과 회색으로 밤하늘을 칠한다
res <- 50
for (i in 1:res)
  grid.rect(y = 1 - (i-1)/res, just = "top",
            gp = gpar(col = NA, fill = grey(0.5 * i / res)))
 
# 달을 그리는 함수 정의
moon <- function(x, y, size) { 
  t <- seq(-90, 90, length = 50) / 180 * pi
  x1 <- x + size * cos(t)
  y1 <- y + size * sin(t)
  mod <- 0.8
  x2 <- x + mod * (x1 - x)
  grid.polygon(c(x1, rev(x2)), c(y1, rev(y1)),
               default.unit = "native",
               gp = gpar(col = NA, fill = "white"))
}
 
# 달을 그린다.
moon(.1, .9, .03) 
 
# 별을 그리는 함수는 함수 정의
star <- function(x, y, size) { 
  x1 <- c(x, x + size * .1, x + size * .5, x + size * .1,
          x, x - size * .1, x - size * .5, x - size * .1) + .05

  y1 <- c(y - size, y - size * .1, y, y + size * .1,
          y + size * .7, y + size * .1, y, y - size * .1) + .05
  grid.polygon(x1, y1, default.unit = "native",
               gp = gpar(col = NA, fill = "white"))
}
 
# 별을 네개 그린다.
star(.5, .7, .02)
star(.8, .9, .02)
star(.72, .74, .02)
star(.62, .88, .02)
 
# 작은별을 스무 개 그린다.
grid.circle(runif(20, .2, 1), runif(20, .6, 1), r = .002,
            default.unit = "native",
            gp = gpar(col = NA, fill = "white"))
 
# 산을 그리는 함수 정의
hill <- function(height = 0.1, col = "black") {
  n <- 100
  x <- seq(0, 1, length = n)
  y1 <- sin(runif(1) + x * 2 * pi)
  y2 <- sin(runif(1) + x * 4 * pi)
  y3 <- sin(runif(1) + x * 8 * pi)
  y <- 0.6 + height*((y1 + y2 + y3) / 3)
  grid.polygon(c(x, rev(x)), c(y, rep(0, n)),
               default.unit = "native",
               gp=gpar(col = NA, fill = col))
}
 
# 산을 그린다
hill()

R로 그린 대낮의 풍경

이번에는 낮의 풍경을 그려보자. 파란 하늘에 노란 태양이 떠 있는 그림이다. Paul Murrell 그림을 응용해서 그려 보았다. 산을 그리는 로직은 Paul Murrell 그린 밤하늘을 것에 색상만 바꾸었다.

library(grid)

# 도화지를 준비했다
pushViewport(viewport(xscale = c(0, 1), yscale = c(0.5, 1),
                      clip = TRUE))   
 
sky <- cm.colors(100)
sky <- sky[-(51:100)] # 하늘색 크레파스
 
# 하늘색 크레파스로 하늘을 그린다.
for (i in 1:res) 
  grid.rect(y = 1 - (i-1) / res, just = "top",
            gp = gpar(col = NA, fill = sky[i]))
 
# 낮에 보니 푸른 산이다.
hill(col = "green4") 
 
#  해를 그리는 함수 정의
sun <- function(x, y, r) 
  grid.circle(x, y, r = r, default.unit = "native",
              gp = gpar(col = NA, fill = "yellow"))
 
# 해를 그린다
sun(0.5, 0.9, 0.04)

구름 한 점 없는 맑은 날이다. 소풍가기 딱 좋은 날인 것 같다.

Citation

For attribution, please cite this work as

유충현 (2016, Jan. 2). Dataholic: grid package로 그림 그리기. Retrieved from https://choonghyunryu.github.io/posts/2016-01-02-grid_picture/

BibTeX citation

@misc{유충현2016grid,
  author = {유충현, },
  title = {Dataholic: grid package로 그림 그리기},
  url = {https://choonghyunryu.github.io/posts/2016-01-02-grid_picture/},
  year = {2016}
}