ggplot2: Aesthetic mapping and scales
시각적 맵핑과 스케일
시각화의 3 요소
- 데이터(Data)
- 시각적 맵핑(Aesthetic mapping)
- 맵핑 : 어떤 시각적 특성을 사용할 것인가?
x
,y
,+ facet_grid(y ~ x)
그리고+ fact_wrap(~g)
color
,fill
shape
size
alpha
: 여러 기하적 대상(예. 점)이 겹칠 때 유용하다.
- 스케일(
scale
) : 어떻게 맵핑할 것인가?x
,y
:scale_x_log10()
,scale_x_reverse()
,scale_x_sqrt()
- 이산형 :
color
,fill
scale_fill_brewer(palette= )
scale_fill_grey(start= , end= , na.value= )
- 연속형 :
color
,fill
scale_fill_distiller(palette= )
scale_fill_gradient(low= , high= )
scale_fill_gradient(low= , high= , mid= , midpoint= )
scale_fill_gradientn(colours= )
- 그 밖에
scale_*_manual(values= )
scale_*_date(date_labels="%m/%d")
scale_*_datetime()
- 맵핑 : 어떤 시각적 특성을 사용할 것인가?
- 기하학적 대상(Geoms)
시각적 맵핑(Aesthetic mapping)의 구체적 방법: 스케일(Scales)
스케일은 한 변수의 값을 특정한 시각적 특성과 대응시키는 구체적인 맵핑(mapping) 방법을 결정한다.
예를 들어 mpg
의 fl
은 연료의 종류를 의미하며 c
, d
, e
, p
, r
중의 하나이다. 이를 어떤 채움색(fill=
)에 대응시키느냐를 스케일이 결정한다.
scale_fill_manual
는 변수가 채움색깔(fill
)에 대응시키는 방법을 손수(manual
) 결정하겠다는 의미이다. 구체적으로 value
는 색깔, break
는 범례에 나타나는 변수값, name
은 범례의 제목, labels
는 범례에서 설명을 나타낸다. 마지막으로 limits
은 실제 시각화되는 범주의 값을 제한한다.
\vfill
g <- ggplot(mpg, aes(x = fl, fill= fl)) + geom_bar()
#01
g
#02
g + scale_fill_manual(
values = c("orange", "skyblue", "royalblue", "blue", "navy"))
#03
g + scale_fill_manual(
values = c("orange", "skyblue", "royalblue", "blue", "navy"),
breaks = c("e", "p"))
#04
g + scale_fill_manual(
values = c("orange", "skyblue", "royalblue", "blue", "navy"),
breaks = c('e', 'p'),
labels = c("Ethanol", "Premium"))
#05
g + scale_fill_manual(
values = c("orange", "skyblue", "royalblue", "blue", "navy"),
breaks = c('e', 'p'),
labels = c("Ethanol", "Premium"),
name = "fuel type")
#06
g + scale_fill_manual(
values = c("orange", "skyblue", "royalblue", "blue", "navy"),
limits = c('e', 'p'),
breaks = c('e', 'p'),
labels = c("Ethanol", "Premium"),
name = "fuel type")
아래는 날짜(date
)형 데이터가 \(x\)-축의 위치로 맵핑되며, \(x\)-좌표의 레이블을 표기하는 여러가지 방법을 보여준다. date_labels
는 날짜가 표기되는 방식을 "%Y"
, "%y"
, "%m"
등을 활용하여 정한다. date_breaks
는 \(x\) 축의 눈금 간격을 정한다.
mpg$yr = as.Date(as.character(mpg$year), "%Y")
mpg2 <- mpg %>% filter(manufacturer %in% c("audi", "dodge", "ford", "jeep"))
#01
ggplot(mpg2, aes(x=yr, y=displ, col=manufacturer)) +
geom_jitter() +
scale_x_date(date_labels="%Y")
#02
ggplot(mpg2, aes(x=yr, y=displ, col=manufacturer)) +
geom_jitter() +
scale_x_date(date_labels="%y-%m")
#03
ggplot(mpg2, aes(x=yr, y=displ, col=manufacturer)) +
geom_jitter() +
scale_x_date(date_labels="%y",
date_breaks="1 year")
ggplot(mpg2, aes(x=yr, y=displ, col=manufacturer)) +
geom_jitter() +
scale_x_date(date_labels="%y",
date_breaks="2 years")
만약 데이터, 시각적 맵핑, 기하학적 대상이 동일한 여러 그래프를 만든다면 ggplot() + geom_****()
를 변수에 저장한 후에 재활용할 수 있다.
다음의 예는 mpg
데이터, 시각적 맵핑(x=yr, y=displ, col=manufacturer
), 그리고 기하학적 대상(geom_jitter
)이 동일한 세 그래프를 스케일을 다르게 하여 그리는 방법을 보여준다.
scale_color_manual
은 색깔을 손수 정한다.scale_color_grey
는 색깔을 흑백으로 시각화한다. 이때 최소값(start
)과 최대값(end
)에 대응하는 명암을 지정하면, 중간값들은 이를 기준으로 결정된다. 결측치(na.value
)에 대한 색깔은 따로 정해줄 수도 있다.scale_color_brewer
는 누군가 이미 만들어놓은 팔레트(pallete
; 자료의 값과 색을 대응시키는 방법)을 사용하겠다는 의미이다.
g <- ggplot(mpg, aes(x=displ, y=hwy, col=drv)) +
geom_jitter()
#01
g
#02
g + scale_color_manual(values=c('red','orange', 'blue','navy'))
#03
g + scale_color_grey(start=0.2, end=0.8, na.value='red')
#04
g + scale_color_brewer(palette = "Dark2")
팔레트(Palettes)
R에서 지원하는 팔레트는 다음의 함수로 살펴볼 수 있다.[gg1]
RColorBrewer::display.brewer.all()
팔레트는 이산형 범주를 위해 마련되었으며 크게 순위형(Sequential), 발산형(Diverging), 범주형(Qualitative)으로 나눠 볼 수 있다.
- 순위형(Sequential) : 이산형 자료가 1점=“보통이에요”, 2점 = “좋아요”, 3점 = “매우 좋아요”와 같은 단극성 자료일 때 사용될 수 있다.
- 범주형(Qualitative) : 이산형 자료 사이에 크고, 작다는 순위 개념을 적용하기 힘든 경우에 사용될 수 있다. “한식”, “중식”, “일식”의 경우, 모든 사람이 동의하는 순위가 존재하지 않는다.
- 발산형(Diverging) : 이산형 자료가 1점=”매우 싫어요”, 2점=“싫어요”, 3점=“보통이에요”, 4점=“좋아요”, 5점=“매우 좋아요”와 같은 양극성(bi-polar) 리커트 척도일 때 사용될 수 있다.
[gg1]: 만약 필요한 색의 갯수가 5
라면 RColorBrewer::display.brewer.all(n=5)
을 사용하고 색맹 친화적인 색이 필요하다면 RColorBrewer::display.brewer.all(colorblindFriendly = TRUE)
를 사용한다. colorbrewer2.org
를 방문할 수도 있다.
colorspace
패키지의 choose_palette()
를 사용하면 팔레트를 직접 만들 수 있다. 아래의 코드는 만들어진 팔레트를 사용하는 방법을 보여준다.
pal <- choose_palette()
g + scale_color_manual(values=pal(3))
다음에 동일한 팔레트를 사용하려면 다음과 같이 팔레트를 화일로 저장해야 한다. 아래 코드에서 'palette.RData'
를 원하는 화일이름으로 바꿔주자. 최초에 설정한 팔레트를 다음에도 사용할 수 있다. 만약 팔레트를 바꾸고 싶다면 앞에서 이름을 정한 화일을 지운다.
if (file.exists("palette.RData")) {
load(file='palette.RData')
} else {
pal <- choose_palette()
save(pal, file="palette.RData")
}
colorspace
패키지에는 미리 만들어 놓은 팔레트도 있다. 다음은 그들 중 일부를 사용하여 시각화를 한 예를 보여준다.
library(colorspace)
g + scale_color_discrete_qualitative(palette='Dark3')
g + scale_color_discrete_diverging(palette='Berlin')
colorspace
패키지의 팔레트는 다음의 명령으로 확인할 수 있다. 아래에서 팔레트 일부를 확인할 수 있다.
hcl_palettes(plot = TRUE)
\(x\)-위치, \(y\)-위치 스케일
어떤 변수를 \(x\)-위치 또는 \(y\)-위치로 맵핑할 때 다음의 방법을 사용할 수 있다.
scale_*_log10()
: 여기서*
에는x
또는y
가 올 수 있다. 변수에 상용로그(log10()
)을 취한 결과를 \(x\) 또는 \(y\)-위치로 한다.scale_*_reverse()
: \(x\) 또는 \(y\)-위치를 뒤집는다.scale_*_sqrt()
: 변수에 제곱근(sqrt()
)을 취한 결과를 \(x\) 또는 \(y\)-위치로 한다.scale_x/y_*****
을 쓸 때에도limits
,breaks
,labels
,name
을 모두 정해줄 수 있다.
h <- ggplot(mpg, aes(x=displ, y=hwy)) + geom_jitter(alpha=0.5)
#01
h
#02
h + scale_x_reverse()
#03
h + scale_x_sqrt()
#04
h + scale_y_log10(breaks=seq(10,50,10),
limits = c(20,40),
labels=c('ten', 'twenty','thirty', 'fourty','fifty'),
name='highway(miles/gallon)')
## Warning: Removed 86 rows containing missing values (geom_point).
퍼시팅(Facetting)
- 퍼시팅(Facetting)은 데이터를 하나 또는 둘 이상의 변수에 따라 나눈 후 분리된 여러 데이터에 대한 그래프를 따로 그린 후 적절하게 배열하는 것을 의미한다. 간편 시각화에서 살펴본 조건부 시각화와 동일하다.
facet_grid(y1 + y2 ~ x1 + x2)
은 작은 그래프를 배치할 때 \(x\)-방향은~
의 오른쪽 변수들에 의해, \(y\)-방향은~
의 왼쪽 변수에 의해 결정된다.facet_wrap(~ var1)
,facet_wrap(~ var1 + var2)
은 하나 또는 둘 이상의 변수에 따라 데이터를 나눈 후 그 결과를 작은 그래프로 한 행에 나열한다. 만약 자리가 부족하면 여러 행에 걸쳐 나타난다.
t <- ggplot(mpg, aes(cty, hwy)) + geom_point()
#01
t
#02
t + facet_grid(. ~ drv)
#03
t + facet_grid(drv ~ .)
#04
t + facet_grid(year ~ drv)
#05
t + facet_grid(.~ drv + year)
#06
t + facet_grid(drv + year ~ .)
#07
t + facet_wrap(~ drv)
#08
t + facet_wrap(~ drv + year)
scales =
인자는 퍼시팅에서 작은 그래프의 \(x\) 또는 $y$의 스케일을 통일할 것인지를 결정한다. 기본값은 모든 그래프에 대해 x, y 스케일을 통일하지만,free
로 설정하면 작은 그래프의 \(x\), \(y\) 스케일은 통일되지 않는다.
t + facet_grid(drv ~ year, scales = "free")
t + facet_grid(drv ~ year, scales = "free_x")
t + facet_grid(drv ~ year, scales = "free_y")
labeller=
인자는 퍼시팅에서 작은 그래프의 이름을 어떻게 표시할 지를 결정한다. 다음의 예를 보자.
t
t + facet_grid(drv ~ ., labeller = label_both)
t + facet_grid(drv ~ ., labeller = label_bquote(alpha ^ .(drv)))
모양(shape
)
모양(shape)을 시각적 특성으로 사용할 경우 대응하는 변수는 팩터형이어야 한다. 모양은 기본적으로 6개의 범주를 다음의 모양과 대응시킨다.
아래 첫 번째 그림에서 보듯이 기본 모양으로 나타낼 수 있는 범주의 최대 갯수는 6이며, 6개를 초과하는 범주는 출력되지 않는다. 그러나 scale_shape_manual(values= )
를 사용하여 7개 이상의 범주에 대해서도 모양을 손수 지정해 줄 수 있다. 이때 모양 값은 다음과 같다.
아래는 데이터의 한 변수와 모양을 대응시켜 출력하는 여러 가지 방법을 보여준다.
mpg4 <- mpg %>% filter(manufacturer %in%
c('audi', 'dodge', 'ford', 'honda', 'hyundai', 'jeep', 'toyota'))
g <- ggplot(mpg4, aes(x=displ, y=hwy, shape=manufacturer)) +
geom_jitter()
g
g + scale_shape_manual(values=c(1,2,3,4,15,16,17))
g + scale_shape_manual(values=c(1,2,3,4,15,16,17),
breaks=c('audi', 'dodge', 'ford'))
g + scale_shape_manual(limits=c('audi','dodge','ford'),
values=c(1,2,3),
breaks=c('audi', 'dodge', 'ford'))
- 이 글은 R로 하는 빅데이터: 데이터 전처리와 시각화 의 일부를 발췌한 것입니다.
YS
mpg2 % filter(manufacturer %in% c(“audi”, “dodge”, “ford”, “jeep”))
Error in mpg %>% filter(manufacturer %in% c(“audi”, “dodge”, “ford”, “jeep”)) :
함수 “%>%”를 찾을 수 없습니다
위와 같이 에러가 납니다.