Small Steps Every Day

매일 천천히 조금씩 앞으로 나아가다.

개인 공부 기록/R 시각화

R 시각화 _ 컬러맵 _ grDevices, RColorBrewer, scico, viridis 활용

mindata1 2025. 4. 2. 16:21
학습목표
1. 색을 표현하는 색상, 명도, 채도 등 세가지 요소를 이해할 수 있다.
2. R에서 색의 이름을 입력하는 방법을 이해하고 사용할 수 있다.
3. R 자체에 내장되어있는 컬러맵과 RColorBrewer, scico 패키지에 내장된 컬러맵을 불러와서 데이터 시각화에 사용할 수 있다. 4. ggplot2를 이용하여 그래프를 작성할 때 사용되는 색상을 스케일 함수를 이용하여 지정할 수 있다.
 
 주요용어
  1. 색상 : 순수한 색의 종류
  2. 명도 : 색의 밝기
  3. 채도 : 순수한 색에 무채색이 섞인 정도
  4. 컬러맵 : 데이터의 값에 색을 대입할 수 있도록 미리 선정해 놓은 색의 모음

library(scales)
show_col(c("red", "orange", "yellow", "green"))

 

show_col(c("#FF0000", "#FFFF00", "#00FF00", 
           "#FF00FF", "#FFFFFF", "#00FFFF", 
           "#0000FF", "#000000", "#0000FF"))

 

rgb(1, 0, 0)
show_col(c(rgb(0, 0, 1), rgb(0, 0, 0.5), rgb(0, 0, 0.3), rgb(0, 0, 0)))

 

show_col(1:9)

 

 

colormap (컬러맵)
  • 미리 선정해 놓은 색의 모음
  • grDevices 패키지에 내장된 컬러맵 함수:
    • 원하는 색의 개수 입력하면 색의 모음을 헥스 코드로 출력
    • rainbow()
    • heat.colors()
    • topo.colors()

 

rainbow(10)

show_col(rainbow(10), ncol=1, cex_label = 0.7, border = NA)
show_col(heat.colors(10), ncol=1, cex_label = 0.7, border = NA)
show_col(topo.colors(10), ncol=1, cex_label = 0.7, border = NA)

 

 

RColorBrewer 패키지
  • 전문가가 선정한 아름다운 컬러맵의 모음

▶ 순차형(sequential) 컬러맵:

- 채도, 명도가 순차적으로 변하여 크고 작은 느낌

- (한쪽 방향으로만 증가하는) 양적 특성에 적합

 

▶ 질적(qualitative) 컬러맵:

- 채도와 명도는 비슷, 다양한 색상 → 순서가 없는 느낌

- 순서가 없는 범주형 특성에 적합

 

▶ 확산형(diverging) 컬러맵:

- 두 가지 다른 색이 양쪽 극단으로 갈 수록 채도가 높아지고 명도가 낮아짐

- (-. +, 양쪽으로 증가하는) 양적 특성에 적합

 

library(RColorBrewer)
display.brewer.all()

brewer.pal(7, "RdBu")
display.brewer.pal(7, "RdBu")

 

scico 패키지
  • 색맹, 색약이 인식하기 쉽고 흑백 인쇄에도 잘 구분되는 24가지 컬러맵
  • 입력: 색의 개수와 컬러맵 이름
  • 출력: 헥스 코드

 

library(scico)
scico_palette_show()

 

 

scico(7, palette = "acton")
show_col(scico(7, palette = "acton"))

 

 

viridis 컬러맵
  • ggplot2 에 내장된 컬러맵
  • 색의 차이가 균일하게 인식되고 색맹, 색약도 쉽게 구분
  • A, B, C, D, E 옵션이 있음 (디폴트: D)

 

ggplot2 에서 색 입력
  • scale_color_XXXX() : 점이나 선의 색 지정
  • scale_fill_XXXX() : 면의 색 지정
  • XXXX : 어떤 색을 어떻게 입력할 지에 따라 달라짐
    • 범주형 변수를 색으로 나타낼 때
      • manual : 색 이름 직접 입력
      • brewer : RColorBrewer의 컬러맵
    • 연속형 변수를 색으로 나타낼 때
      • gradient : 색 이름 직접 입력
      • distiller : RColorBrewer의 컬러맵
      • viridis : viridis의 컬러맵
      • scico : scico의 컬러맵 (별도 설치 및 로드 필요)

 

setwd("/Users/sm/Desktop/KNOU/visual/R-codes")
load("sah.RData")
library(ggplot2)
ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point()

 

ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point() +
  scale_color_manual(values=c("underweight"="tomato1", "normal"="tomato2", 
                              "overweight"="tomato3", "obese"="tomato4"))

 

ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point() +
  scale_color_manual(values=c("tomato", "orange", "skyblue", "forestgreen"))

 

ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point() +
  scale_color_manual(values=c("underweight"="tomato1", "normal"="tomato2", 
                              "overweight"="tomato3", "obese"="tomato4"))

 

ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point() +
  scale_color_brewer(palette="Set2")

 

 

ggplot(sah, aes(BMI.cat)) + geom_bar()

 

 

ggplot(sah, aes(BMI.cat, fill=BMI.cat)) + geom_bar()

 

ggplot(sah, aes(BMI.cat, fill=BMI.cat)) + geom_bar() + 
  scale_fill_manual(values=c("tomato", "orange", "skyblue", "forestgreen"))

 

 

ggplot(sah, aes(BMI.cat, fill=BMI.cat)) + geom_bar() + 
  scale_fill_manual(values=c("#66C2A5", "#FC8D62", "#8DA0CB", "#E78AC3"))

 

 

ggplot(sah, aes(BMI.cat, fill=BMI.cat)) + geom_bar() + 
  scale_fill_brewer(palette="Blues")

 

 

# 연속형 변수의 값을 표현하는 색 채널 지정하기
e<-ggplot(sah, aes(age, ldl, color=obesity)) + geom_point() 
e

 

 

e + scale_color_gradient(low="yellow", high="red")

 

 

e + scale_color_viridis_c()

 

e + scale_color_viridis_c(option="A")

 

 

e + scale_color_distiller(palette="Purples")

 

 

e + scale_color_scico(palette="vik")

 

 

범례의 색 디테일 바꾸기
  • 범례에서 막대의 위아래 방향 바꾸기
    • guides(color=guide_colorbar(reverse=TRUE))
  • 범례 막대를 가로로 눕히기
    • guides(color=guide_colorbar(direction = "horizontal"))

 

e + guides(color=guide_colorbar(reverse = TRUE))

 

 

e + theme(legend.position = "bottom") +
  guides(color=guide_colorbar(direction="horizontal"))

 

점, 선, 면 전체의 색 지정
  • geom 함수 안에 'color= ' 또는 'fill= ' 구문으로 색 지정
    • 점이나 선의 색: color=
    • 면의 색: fill=
    • 반드시 aes() 구문 바깥에

 

ggplot(sah, aes(age, ldl, color=BMI.cat)) + geom_point(color="dodgerblue3")

 

 

# aes 밖에 매핑해야 적용됨
ggplot(sah, aes(BMI.cat)) + geom_bar(fill="dodgerblue3")
ggplot(sah) + geom_bar(aes(BMI.cat), fill="dodgerblue3")

# aes 안에 매핑 시, 색 적용 안됨
ggplot(sah) + geom_bar(aes(BMI.cat, fill="dodgerblue3"))