ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • R Graphics - Color 설정
    Programming/R Programming 2020. 6. 23. 15:56

    title: "R Graphics 13-2"
    author: "Haeseong Oh"
    date: '2020 6 23 '
    output: html_document


    R Graphics

    색상 표현하기

    R에서의 색상 표현 방법의 종류

      1. 색상 상수로 표현하는 방법
      1. 색상의 이름으로 표현하는 방법
      1. RGB색상으로 표현하는 방법

    RGB 색상

    • 빛의 삼원색인 R(Red), G(Green), B(Blue)의 조합으로 정의하는 색상을 의미
    • 16진수를 활용하여 0에서 255의 값을 가질 수 있으며, 보통 컴퓨터에서는 16진수를 활용하여 'FF2211'과 같이 나타낸다.
    1.색상을 상수로 표현하기
    • 1~8 사이의 정수로 정의. 8보다 큰 정수 적용시 recycling 규칙에 의해 반복.
    • 1: 검정, 2: 빨강, 3: 녹색, 4: 파란색 5:하늘색 6: 자주색, 7: 노란색, 8: 회색
    col.table = function(cols, main=NULL, fg=NULL){
      n = length(cols)
      plot(seq(n), rep(1, n), xlim = c(0,n), ylim = c(0,1),
           type = 'n', xlab = "", ylab = "", axes = F)
      if(is.null(main))
      {
        main = paste('Color Table by', deparse(substitute(cols)))
      }
      title(main=main)
    
      if(is.null(fg))
      {
        fg = unlist(lapply(cols,
                           function(x)
                             ifelse(mean(col2rgb(x)) > 127 | toupper(x) %in% c ("WHITE", "#FFFFFF"), "black", "white")))
      }else{
        fg = rep(fg, n)
    
        for(i in 1:n)
        {
          polygon(c(i-1, i-1, i, i), c(0.05, 1, 1, 0.05), col=cols[i])
          text(mean(c(i-1, i)), 0.52, labels = cols[i], srt=90, adj=0.5, col=fg[i], cex=1.2)
        }
      }
    }
    par(mfrow=c(2,1))
    col.table(1:16)
    col.table(5:20)
    2.색상 이름으로 표현하기
    • 모든 색상에 이름을 부여하기에는 한계가 존재
      • RGB 색상 = 256256256=16,777,216의 색상으로 표현
    • R에서는 657개의 색상에 대한 이름 제공
      • colors()
    • 색상의 이름만으로는 어떠한 색인지 알 수 없는 경우
      • colors()와 col2rgb() 함수를 사용하여 내용 확인 가능
    cols = colors()
    length(cols)
    cols[1:5]
    grep("sky", cols, value=TRUE)
    col2rgb(grep('sky', cols, value=TRUE))
    par(mfrow=c(2,1), mar=c(1,1,3,1))
    col.table(grep('sky', cols, value=TRUE))
    col.table(grep('red', cols, value=TRUE))
    col.map = function(cols=colors())
    {
      n <- length(cols)
      cnt <- floor(sqrt(n))
      plot.new()
      plot.window(xlim=c(0, cnt), ylim=c(0,cnt))
    
      for (i in 1:cnt) for (j in 1:cnt)
        rect(i-1, j-1, i, j, col=cols[(i-1)*cnt+ j], border=NA)
    }
    col.map(colors())
    3.색상을 RGB로 표현하기
    • R에서의 RGB형식
      • #RGB의 형태의 문자열로 나타낸다
      • 각 RGB는 2개의 16진수로 표기: #RRGGGB
      • col2rgb() 함수
        • 주어진 수 or 색상 이름을 RGB 표현으로 바꾸어주는 함수
      • RGB 표현 시 유용한 함수
        • as.character.hexmode(number) #16진수 변환
        • toupper(char) #대문자로 변환
        • rev(vector) #벡터의 순서를 반대로 정리

    RGB 색상으로 표현하는 방법 예제

    seqs = seq(0,255,length=15)
    seqs
    hexs = toupper(as.character.hexmode(seqs))
    hexs
    red = paste('#', hexs, "0000", sep = "")
    green = paste("#00", hexs, "00", sep="")
    blue = paste("#0000", hexs, sep = "")
    mix1 = paste("#", hexs, hexs, hexs, sep="")
    mix2 = paste("#", rev(hexs), hexs, rev(hexs), sep="")
    par(mfrow=c(5,1), mar=c(1,1,3,1))
    col.table(red)
    col.table(green)
    col.table(blue)
    col.table(mix1)
    col.table(mix2)

    색상 팔레트

    • 색상 팔레트(color palettes)
      • 일정 간격으로 색상을 나타내어 미리 정해두고 사용하는 색상 벡터를 나타낸다.
      • R에서는 몇 가지 색상 팔레트를 제공
        • rainbow() : 무지개 색상의 팔레트
        • heat.colors() : 따뜻한 색감의 색상 팔레트
        • terrain.colors() : 지형을 나타내는 색감의 색상 팔레트
        • topo.colors() : 지형을 나타내는 색감의 색상 팔레트
        • cm.colors() : cyan에서 magenta로 진행되는 색상 팔레트
        • gray() : 회색 계열로 구성된 색상 팔레트.(0:블랙, 1:화이트 계열)
    par(mfrow = c(6,1), mar=c(0,0,2,0))
    col.table(rainbow(20))
    col.table(heat.colors(20))
    col.table(terrain.colors(20))
    col.table(topo.colors(20))
    col.table(cm.colors(20))
    col.table(gray(seq(0,255,length=20)/255))
    
    par(mfrow=c(2,2), mar=c(0,0,2,0))
    col.map(rainbow(400, start = 0, end = 0.8))
    col.map(heat.colors(400))
    col.map(cm.colors(400))
    col.map(topo.colors(400))

    알파 채널

    • 알파 투명 채널 (alpha transparency channel)
      • 색상의 투명도를 지정하는 값
      • 표현 형식: RGB 형식의 뒤에 두 자리의 16진수로 투명도 표시
        • #RRGGBBAA : R,G, B, A의 값
        • AA = 00 이면 투명 (색상이 나타나지 않는다)
        • AA = FF 이면 불투명 (알파 채널 생략 시 동일한 결과)
      • 여러 그래프가 중첩되어 구조를 파악하기 어려운 경우, 투명도를 활용하여 구조를 용이하게 파악할 수 있다.
    seqs = seq(0, 255, length = 20)
    alpha = toupper(as.character.hexmode(seqs))
    par(mfrow = c(5,1), mar = c(0,0,2,0))
    col.table(paste("#FF0000", alpha, sep=""), fg =1)
    col.table(paste("#00FF00", alpha, sep=""), fg =1)
    col.table(paste("#0000FF", alpha, sep=""), fg =1)
    col.table(rainbow(20), main = "Alpha Channel 사용 안 함")
    col.table(rainbow(20, alpha = seq(0, 1, length=20)),
              main = "Alpha Channel 사용", fg=1)
    
    
    x = c(1, 1.3, 1.6)
    y = c(1,2,1)
    par(mar=c(4,2,3,1), mfrow = c(1,2))
    plot(x, y, pch = 16, cex = 20, col = c('red', 'green', 'blue'),
         xlim = c(0,3), ylim = c(-2, 5))
    title(main = "col=c('red', 'green', 'blue')")
    plot(x, y, pach = 16, cex= 20, col=c("#FF000077", "#00FF0077", "#0000FF77"), xlim = c(0,3), ylim = c(-2,5))
    title(main = "alpha channel by \"77\77")
    
    • hsv() 함수
      • 색의 세 가지 속성인 색상, 채도, 명도를 사용하여 색상을 지정
      • 함수의 인수: h,s,v,alpha(투명도)
        • 함수의 인수의 값은 각각 0 - 1 사이의 값
        • 함수의 반환 값: 'RRGGBBAA'의 형태
    • rgb() 함수
      • red green, blue, alpha의 값을 인수로 하여 색상값을 반환
      • 함수의 인수값은 기본 설정으로 (0-255)/255의 값으로 표현
      • 함수의 반환 값 : 'RRGGBBAA'의 형태
    #왼쪽 아래부터위로 1,2,3,4 순서임.
    par(mfrow = c(2,2))
    par(mar=c(0.1, 0.1, 1, 0.1))
    hsv(0.5, 0.5, 0.5)
    hsv1 = c(hsv(0.5, 0.5, 0.5), hsv(0.6, 0.5, 0.5),
             hsv(0.7, 0.5, 0.5), hsv(0.8, 0.5, 0.5))
    hsv2 = c(hsv(0.5, 0.5, 0.5), hsv(0.5, 0.6, 0.5),
             hsv(0.5, 0.7, 0.5), hsv(0.5, 0.8, 0.5))
    
    col.map(hsv1)
    title('hsv1')
    col.map(hsv2)
    title("hsv2")
    reds1 = rgb((0:15)/15, g=0, b=0)
    reds2 = rgb((0:15)/15, g=0, b=0, alpha = 0.5)
    gray1 = gray(0:8/8)
    gray2 = gray(0:8/8, alpha = 0.5)
    par(mfrow = c(2,2), mar = c(1,3,1,1))
    col.map(reds1)
    title('red1')
    col.map(reds2)
    title('reds2')
    col.map(gray1)
    title('gray1')
    col.map(gray2)
    title('gray2')
    • PNG BMP PDF 형식

        1. png, jpeg, bmp, pdf 형식 파일 선언하기 (Open Device)
        • png(filename='d:test.png')
        • bmp(filename='d:test.bmp')
        • pdf(file='d:test.pdf') #여러 plot을 동시 출력 가능
        1. plot 실행 (Draw Picture)
        • a = 1:10
        • b = 2*x + rnorm(10)
        • plot(a,b)
        1. Device Off (Close Device)
        • dev.off()
    • Device copy를 이용한 내보내기

      • (1) plot 실행
        • a = 1:10
        • b = 2*x + rnorm(10)
        • plot(a,b)
      • (2) Device COPY
        • dev.copy(jpeg,filename='d:/test.jpg')
      • (3) Device OFF
        • dev.off()
Designed by Tistory.