그래픽 디바이스의 영역을 나누는 레이아웃 설정

par()

그래픽 디바이스에 그래프가 그려질 때 한 면에 하나 이상의 그래프를 그릴 수 있는데, 이런 경우 그래픽 디바이스의 영역을 나누는 레이아웃을 설정하는 함수

  • mfrow : 행으로 그래픽을 채워감
    • par(mfrow = c(2, 3)) : 전체 그래픽 창이 2행 3열로 구분.
  • mfcol : 열을 중심으로 그래프를 채워나감.
    • par(mfcol = c(2, 3)) : 전체 그래픽 창이 2행 2열로 구분되며 총 4장의 그래프.

layout()

par() 함수에 mfrow, mfcol 옵션을 사용하는 경우, 그래프가 위에서 아래로 채워지는 반면, layout() 함수를 이용하면 그 순서를 임의로 정할 수 있음. 행과열의 크기도 조절 가능.

  • 첫번째 인자로 매트릭스를 취함 : 매트릭스의 정수 값이 구역의 이름이기도 하고 그래프가 그려지는 순서이기도 함.
  • 아래와 같이 레이아웃을 설정하면 아래 1번부터 그래프가 채워짐.
layout(matrix(3:1))
layout.show(3)

  • 아래와 같이 하면 첫번째 그래프는 하단 왼쪽, 구번째 그래프는 상단 왼쪽, 세번째 그래프는 하단 오른쪽에 그려짐. 0으로 된 부분을 그래프가 채워지지 않음.
layout(matrix(c(2,1,0,3), ncol=2))
layout.show(3)

  • layout() 함수는 heighs 옵션을 사용해 높이를 정할 수 있고, respect 옵션을 이용해 하단의 길이 대비 높이를 정할 수도 있음. 아래 코드는 하단의 길이가 단위 1이라면, 첫번째 행의 높이는 단위 1.5가 되고, 두번째 행의 높이는 1이 됨.
layout(matrix(c(2, 1, 2, 3), ncol = 2), heights = c(1.5, 1), respect = T)
hist(rnorm(100))
hist(rnorm(200))
hist(rnorm(300))

고수준 함수와 저수준 함수

par(mfrow = c(2, 1))
set.seed(10)
samp <- rnorm(1000)
hist(samp, prob = T) # 히스토그램
lines(density(samp), col = 'red')

plot(mpg~wt, data = mtcars) # 산포도
abline(lm(mpg~wt, data = mtcars), col = 'red')

painters model 과 grammer of graphics model

plot(mtcars$wt, mtcars$mpg, pch = (1:3)[as.factor(mtcars$cyl)]) # 산포도 그라기
legend("topright", legend = levels(as.factor(mtcars$cyl)), pch = 1:3) # 범례생성
title(main = "mpg vs. wt and cyl") # 제목 추가

library(ggplot2)
ggplot(mtcars, aes(wt, mpg, shape = as.factor(cyl))) +
  geom_point() +
  ggtitle("mpg vs. wt") +
  scale_shape_discrete(name = "Number of \ncylinder")

ggplot(mtcars, aes(wt, mpg)) +
  geom_point() +
  facet_grid(cyl~gear)

- 위 그래프의 경우, mtcars 데이터셋의 wt 와 mpg 의 관계를 보여주는데, cyl 과 gear에 따라 어떻게 달라지는지 보여줌 -> 네 변수의 관계를 살필 수 있음.

코드청크에 의한 그래프 생성 (r markdown)

그래프의 크기 조절

그래프의 크기 조절은 그래픽 디바이스를 기준으로 정하는 방법과 출력물을 기준으로 정하는 방법이 있음. * 그래픽 디바이스를 기준으로 그래프의 크기를 조절하는 것은 인치 단위로 절대값을 정하는 것 * 출력물을 기존으로 그래프의 크기를 조절하는 것은 출력물에 따라 상대적인 값으로 정하는 것을 의미

방법 옵션 디폴트 사용법
그래픽 디바이스 크기를 조절 fig.width fig.height 7 인치 단위의 숫자 사용
출력물 기준으로 조절 out.width out.height NULL 문자열로 준다. 인치 이외의 단위는 이 방법을 사용함 (예: 5cm, 300px)
  1. 그래프 디바이스 기준 크기 조절
library(ggplot2)
data(iris)
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_point()

  1. 출력물 기준 그래프 크기 조절
library(ggplot2)
data(iris)
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_point()

레이텍에서는 \textwidth 의 상대적인 값을 많이 사용함.

  • \textwidth 는 출력문서에서 문단의 폭에 해당됨.
  • 그래프를 textwidth 의 0.7배로 하려면 textwidth=‘0.7\textwidth’ 로 줌.

한 코드 청크에서 여러 그래프를 저장하는 방법 : fig.keep= 옵션

  • 디폴트 : 최종적인 결과만 필요한 경우가 많기 때문에 고수준 그래픽 함수로 만들어진 것만을 저장하도록 fig.keep=‘high’ 로 되어 있음.
  • 모든 단계별로 생성되는 그래프를 저장(keep) 하는 옵션은 fig.keep=‘all’
  • fig.keep=‘first’ : 처음의 그래프만 저장
  • fig.keep=‘last’ : 가장 마지막 그래프만 저장
  • fig.keep=‘none’ : 만들어지는 그래프를 저장하지 않음.

복수의 그래프에 다른 옵션값 설정

옵션값을 벡터로 줌 : out.width = c(‘200px’, ‘300px’, ‘400px’)

그래프의 배치를 조절하는 옵션

좌우정렬 : fig.align=
  • 출력되는 그래프를 문서 안에서 왼쪽, 오른쪽, 가운데로 정렬되는 방법을 지정
  • fig.align 으로 지정, 옵션은 ‘defaul’, ‘left’, ‘center’, ‘right’
library(ggplot2)
data(iris)
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_point()

library(ggplot2)
data(iris)
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_point()

코드와 그래프의 상대적 위치 : fig.show=

코드와 같이 출력할 경우 코드와 그래프 출력물의 상대적인 위치를 지정

  • fig.show=
    • ‘asis’ : 디폴트, R 콘솔엣와 비슷하게
    • ‘hold’ : 코드가 모두 출력되고 나서
    • ‘hide’ : 그래프를 출력하지 않음
set.seed(13)
a <- rnorm(1800)
plot(a)

hist(a, prob=T)
lines(density(a), col='red') 

set.seed(13)
a <- rnorm(1800)
plot(a)
hist(a, prob=T)
lines(density(a), col='red') 

복수의 그래프 레이아웃 설정

1. 코드청크가 출력하는 여러 그래프가 있을때, 이들 그래프 간의 배치를 결정하는 법
  • 디폴트 : 하나의 코드청크에서 여러개의 그래프를 출력할 때, 페이지의 폭이 여유가 있으면 바로 이어서 출력
  • 두개의 그래프를 좌우로 나오게 하려면 그래프의 출력 폭을 전체 폭의 절반 이하가 되도록 설정. 즉 공간의 여유가 있으면 자연스럽게 흘러가도록 하는 것.
set.seed(7)
library(ggplot2)
a <- rnorm(1000, mean=58, sd=4)
hist(a)
df <- data.frame(a)
p <- ggplot(df, aes(a)) +
  geom_histogram(binwidth = 1, fill="white", color="black", aes(y=..density..))
p
p <- p + 
  geom_density(fill="red", alpha=0.1, col="red")
p
p <- p +
  geom_vline(aes(xintercept=mean(a)), col = "red", linetype = "dashed")
p

  • 모두 4개의 그래프를 만들기 때문에 폭을 25% 이하로 값을 주면 4개의 그래프를 한 줄로 만들 수 있음.
  • 퍼센트 단위를 사용할 경우는 out.width 옵션을 사용하고, 문자열 형태로 값을 줌.

2. par(), layout() 함수를 이용하는 방법

par() 를 사용할 때는 나눠지는 영역의 크기가 모두 같음. 그래프마다 나눠지는 크기를 다르게 하고 싶다면 layout() 을 이용할 수 있음.

par(mfrow=c(3,1))
data(iris)
hist(iris$Petal.Width)
hist(iris$Petal.Width)
hist(iris$Petal.Width, prob=T)
lines(density(iris$Sepal.Width), col="red")

par(), layout() 함수를 이용하여 그래프를 배치하는 방법은 전통적 그래픽 시스템으로 만든 그래프 에서만 적용됨.

  • R의 전통적 그래픽 시스템과 그리드 그래픽은 다른 시스템으로 하나의 그래픽 창에 혼용할 수 없음.
  • 이것을 해결할 수 있는 방법은 gridBase 패키지를 사용하여 전통적 그래픽 시스템으로 만든 그래프를 그리드 시스템으로 통합시키는 방법이 있음.

gridExtra 패키지를 이용한 그리프 그래프 레이아웃 설정

레이아웃 설정을 위한 함수 : grid.arrange()
  • 한 판에 연관이 있는 그래프를 그리기 위해서는 축의 크기를 서로 맞추어야 함 : scale_x_continuous() 사용
  • grid.arrange() 를 보면, 특별한 옵션이 없는 한 그래프는 왼쪽 상단에서 오른쪽 하단방향으로 그래프를 채워나감.
  • ncol 옵션은 전체 레이아웃의 열의 숫자를 결정, widths 옵션은 열의 폭의 비율을 결정
library(HSAUR2) # water 데이터셋 이용
## Loading required package: tools
library(grid)
library(ggplot2)
library(gridExtra)
p1 <- ggplot(water, aes(hardness, mortality)) +
  stat_smooth(method = "lm")
p1 <- p1 + geom_point(aes(col=location)) + 
  scale_x_continuous(limits=c(0,150)) +
  theme(legend.position=c(0.85, 0.8))
p2 <- ggplot(water, aes(hardness)) +
  geom_histogram(binwidth = 20, fill = "darkgray") +
  scale_x_continuous(limits = c(0, 150))
p3 <- grid.rect(gp = gpar(col = "white"))

p4 <- ggplot(water, aes(location, mortality)) +
  geom_boxplot() +
  theme(axis.title.y = element_blank())
grid.arrange(p2, p3, p1, p4, ncol = 2, widths = c(1.2, 1))

  • 눈에 보이는 그래프는 3개 이지만, 실제로는 바탕이 하얀 사각형을 가진 그래프 p3 가 하나 더 있음.
  • 눈에 보이는 그래프 (p1, p2, p4) 는 서로 연관이 있음. x축으로는 hardness, y축으로는 mortality 가 서로 연관이 있다.

캡션과 레이블

그래프에 한글 삽입

일반적인 R 콘솔에서 한글이 포함된 그래프

  • R 은 여러 그래픽 디바이스들을 사용하는데, 그래프에 한글을 포함시키려면 특정 그래픽 디바이스에서 인식하는 한글 폰트 패밀리를 알아야 한다.
  • 어떤 그래픽 디바이스가 지원하는 폰트는 보통 그래픽 디바이스에 이름에 Fonts() 를 붙여서 만든 함수를 통해 알 수 있따.
names(pdfFonts())
##  [1] "serif"                "sans"                 "mono"                
##  [4] "AvantGarde"           "Bookman"              "Courier"             
##  [7] "Helvetica"            "Helvetica-Narrow"     "NewCenturySchoolbook"
## [10] "Palatino"             "Times"                "URWGothic"           
## [13] "URWBookman"           "NimbusMon"            "NimbusSan"           
## [16] "URWHelvetica"         "NimbusSanCond"        "CenturySch"          
## [19] "URWPalladio"          "NimbusRom"            "URWTimes"            
## [22] "ArialMT"              "Japan1"               "Japan1HeiMin"        
## [25] "Japan1GothicBBB"      "Japan1Ryumin"         "Korea1"              
## [28] "Korea1deb"            "CNS1"                 "GB1"
p <- ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point()
p <- p + ggtitle("한글제목")
p <- p + theme(text = element_text(family = "NanumGothic"))
p

extrafont 패키지

extrafont 패키지는 컴퓨터에 있는 트루타입 폰트를 읽어와서 R 에서 사용할 수 있게 해둠.

library(extrafont)
## Registering fonts with R
#font_import()

니터방식에서 그래프 한글 식자

boxplot(Sepal.Width~Species, data = iris)
title(main = "박스그래프", family = "NanumGothic")