library(plyr)
library(ggplot2)
setwd("C:/Users/Byeongsoo/Desktop/R markdown")
load("market_price.RData")
일단 작업에 필요한 환경을 만들어주고 ~
res <- ddply(market_price, .(M_TYPE_NAME, A_NAME), summarise, avg = mean(A_PRICE))
M_TYPE_NAM과 A_NAME에 summarise를 적용하는 데 avg는 A_PRICE의 평균을 나타낸다.
res.plot <- ggplot(res, aes(A_NAME, M_TYPE_NAME)) + geom_tile(aes(fill = avg)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) + scale_fill_gradient(low = "green",
high = "red")
<2>
이런 코드는 예전에 했던 것이므로 익숙하다.
필요한 포맷은 잉크스케이프에서 쓰일 벡터 기반의 그래프로, R에서 pdf출력을 통해 파일을 얻을 수 있다.
한글이 포함된 pdf파일을 출력하면, 한글 폰트가 깨진다 _이때 cairo_를 사용하여 이 문제를 피할 수 있다.
<3>
또 한가지 문제는 cairo_pdf의 기본 폰트는 한글을 표현 할 수 없다. <4>
이 문제를 해결해보자.
# R 시스템에 등록된 폰트 리스트를 리스팅한다.
windowsFonts()
## $serif
## [1] "TT Times New Roman"
##
## $sans
## [1] "TT Arial"
##
## $mono
## [1] "TT Courier New"
# 폰트 등록
windowsFonts(malgun = windowsFont("맑은 고딕"))
windowsFonts()
## $serif
## [1] "TT Times New Roman"
##
## $sans
## [1] "TT Arial"
##
## $mono
## [1] "TT Courier New"
##
## $malgun
## [1] "맑은 고딕"
windowsFonts() 명령어를 사용하면 현재 R 시스템에 등록된 폰트 매핑 테이블이 출력된다.
# 맑은고딕 폰트를 지정하고 그래프를 pdf로 저장
cairo_pdf(family = "malgun", width = 10, height = 5)
res.plot
dev.off()
## pdf
## 2
graphics.off()
이렇게 하면 getwd()에서 출력되는 디렉토리에 Rplot001.pdf, Rplot002.pdf등의 이름의 파일이 생성된다.
이제 필요한 pdf파일은 완성됐다.
dev.off()를 실행해야 파일을 열 수 있다. 그래도 안되면 graphics.off()를 실행해야 한다. 이 명령어는 현재 이 그래프를 사용하고 있는 장치를 종료하는 명령어이다.
dev.off()를 하면 RStudio상에서 보여주는 그래프가 종료됨을 알 수 있다.
다음은 JPEG와 PNG를 동일 크기의 이미지로 출력하기 위한 예제 코드다.
library(ggplot2)
jpeg(width = 500, height = 500, filename = "jpg.jpg") # ----- ①
ggplot(diamonds, aes(carat, price)) + geom_line(aes(colour = clarity))
jpeg파일을 생성한다.
png(width = 500, height = 500, filename = "png.png") # ----- ②
ggplot(diamonds, aes(carat, price)) + geom_line(aes(colour = clarity))
png파일을 생성한다.
cairo_pdf(filename = "pdf.pdf") # ----- ③
ggplot(diamonds, aes(carat, price)) + geom_line(aes(colour = clarity))
<1>
확대 해보면, jpeg파일의 경계가 흐릿하고, 색상도 바랜 느낌이다. jpeg와 png모두 라인이 계단 모양으로 나타난 것을 알 수 있다.
png에도 만족하지 못한다면, pdf포맷 이미지를 출력할 것을 추천한다.
<5>
png(width = 400, height = 400, filename = "pngnaa.jpg", family = "malgun")
ggplot(diamonds, aes(carat, price), family = "malgun") + geom_line(aes(colour = clarity)) +
ggtitle("none 안티얼라이어싱")
dev.off()
## pdf
## 2
png(width = 400, height = 400, filename = "안티얼라이어싱.jpg", type = "cairo",
antialias = "subpixel", family = "malgun")
ggplot(diamonds, aes(carat, price), family = "malgun") + geom_line(aes(colour = clarity)) +
ggtitle("안티얼라이어싱")
dev.off()
## pdf
## 2
<안티얼라이싱>
cairo가 기본 탑재돼 있기 때문에, 위와 같은 명령어로 안티얼라이어싱을 할 수 있다.
png(width = 360, height = 360, filename = "pngaa360.jpg", type = "cairo", antialias = "subpixel",
family = "malgun")
# res= 72 옵션은 생략
ggplot(diamonds, aes(carat, price), family = "malgun") + geom_line(aes(colour = clarity)) +
ggtitle("72 ppi(dpi)")
dev.off()
## pdf
## 2
5인치를 표현하려면 가로와 세로를 360(5X72)픽셀로 지정해야 된다.
png(width = 1100, height = 1100, filename = "pngaa1100.jpg", type = "cairo",
antialias = "subpixel", family = "malgun", res = 220)
ggplot(diamonds, aes(carat, price), family = "malgun") + geom_line(aes(colour = clarity)) +
ggtitle("220 ppi(dpi)")
dev.off()
## pdf
## 2
220ppi를 지원하는 같은 내용의 이미지를 만들기 위한 코드이다. 1100픽셀로 계산된다.
이제 두 그림을 비교해 보자. <6> <7> 확대해보면 더 큰 차이를 느낄 수 있다.