Chapter 14

팔레트 만들기

웹사이트 하나를 열어 그 안에 쓰인 색을 모두 세어 보면 놀랄 때가 많다. 초록만 일곱 가지, 회색은 열두 가지, 그중 절반은 누군가 그날 기분에 따라 "조금 더 진하게" 고친 값이다. 색을 잘 고르는 것만큼 중요한 일은, 고른 색을 몇 개의 단계와 몇 개의 역할로 정리하는 일이다. 이 장은 색 하나에서 출발해 화면과 차트와 사진을 모두 감당하는 한 벌의 팔레트를 만든다.

팔레트는 역할의 목록이다

화가의 팔레트는 물감을 짜 놓은 판이다. 물감 열두 개를 짜 두었다고 열두 색만 쓰는 것은 아니다. 섞고, 물을 타고, 덧칠해 수백 가지 색을 만든다. 디자인의 팔레트는 반대 방향으로 움직인다. 색은 얼마든지 만들 수 있으니, 쓸 수 있는 색을 일부러 줄이고 각각에 일을 맡긴다. 버튼은 이 색, 본문 글자는 이 색, 경고는 이 색. 그래야 화면 백 장을 여러 사람이 만들어도 한 가게의 화면처럼 보인다.

그래서 디자인 팔레트는 보통 세 층으로 짓는다. 맨 아래는 실제 색 값을 단계별로 늘어놓은 톤 스케일(Tonal scale), 곧 한 색상을 밝은 쪽에서 어두운 쪽까지 열 단계쯤으로 나눈 사다리다. 그 위에 "버튼 바탕", "본문 글자", "테두리"처럼 쓰임의 이름을 붙인 의미 토큰(Semantic token)이 있다. 토큰은 색 값을 직접 갖지 않고 사다리의 한 칸을 가리키는 이름이다. 맨 위에는 그 토큰으로 칠한 버튼, 카드, 알림 같은 부품이 있다.

① 톤 스케일 ② 의미 토큰 ③ 부품 50300400600800900 색 값의 사다리 (hex는 여기만) 버튼 바탕→600 링크→600 배지 바탕→100 배지 글자→800 어두운 화면 링크→400 가을 낭독회 10월 18일 토 오후 4시 남은 자리 6 예약하기 자세히 보기 부품은 토큰만 안다 브랜드 색을 바꾸면 ①만, 다크 모드는 ②의 화살표만 바꾼다
그림 1. 팔레트의 세 층. 실제 색 값(hex)은 맨 왼쪽 톤 스케일에만 있다. 가운데 의미 토큰은 "버튼 바탕은 600번"처럼 사다리의 칸을 가리키는 이름이고, 오른쪽 부품은 토큰만 쓴다. 브랜드 초록을 바꾸면 사다리를 다시 만들기만 하면 되고, 어두운 화면을 만들 때는 화살표(어느 칸을 가리키는지)만 바꾼다. 색 값은 이 장의 케이스에서 만드는 책방 E의 초록 사다리다.

층을 나누는 이유는 바뀌는 것과 바뀌지 않는 것을 떼어 놓기 위해서다. 브랜드 초록이 조금 바뀌어도 "버튼 바탕은 브랜드의 가장 진한 쓸 만한 칸"이라는 규칙은 그대로다. 어두운 화면에서는 같은 "링크"라는 역할이 사다리의 더 밝은 칸을 가리켜야 한다. 이 장의 시뮬레이터는 이 세 층을 아래에서부터 하나씩 쌓아 올린다.

한 색에서 열 단계로

톤 스케일을 만드는 가장 손쉬운 방법은 색 고르기 도구에서 HSL의 명도(L)만 10%씩 바꾸는 것이다. 1장과 3장에서 본 대로, HSL의 명도는 사람이 느끼는 밝기가 아니다. 그래서 그렇게 만든 사다리는 어떤 칸 사이는 성큼 뛰고 어떤 칸 사이는 거의 붙는다. 색상에 따라서도 다르다. 노랑으로 같은 일을 하면 밝은 쪽 다섯 칸이 거의 구별되지 않는다.

지각 균일 공간 OKLCH에서 명도를 고르게 나누면 칸 사이의 밝기 차이가 눈에 고르게 느껴진다. 다만 한 가지 제약이 있다. 아주 밝거나 아주 어두운 쪽에서는 화면이 낼 수 있는 채도가 줄어든다. 그래서 OKLCH 사다리는 명도를 고르게 나누되, 채도는 그 명도에서 낼 수 있는 만큼으로 줄인다. 아래 시뮬레이터에서 두 방식을 바꿔 가며 아래 그래프의 명도(L*) 계단이 얼마나 고른지 본다.

SIMULATOR

톤 스케일: HSL 사다리와 OKLCH 사다리

이웃 칸 명도 차 ΔL*—
흰 바탕 4.5:1을 처음 넘는 칸—
기준색(600)—
해볼 것: ① OKLCH 명도에서 이웃 칸의 명도 차는 8~10으로 고르다. HSL 명도로 바꾸면 점들이 대각선(점선)에서 휘어, 밝은 쪽 다섯 칸은 5~6씩, 어두운 쪽 네 칸은 10~13씩 움직인다. 숫자로는 똑같이 "8.9%씩" 내렸는데도 그렇다. ② 색상을 95° 근처(노랑)로 옮긴다. OKLCH 사다리는 여전히 고르지만 어두운 칸들은 올리브·갈색으로 보인다. 어두운 노랑이라는 색은 원래 없기 때문이다. ③ 채도 욕심을 2.6까지 올린다. 가운데 칸은 선명해지지만 양 끝은 화면의 색역에 막혀 채도가 꺾인다(그래프의 막대). 사다리 전체가 고르게 선명할 수는 없다. (이 장의 사다리는 기준색을 600번에 두고, 그 위로 OKLCH 명도 0.97까지 여섯 칸, 아래로 0.29까지 세 칸을 같은 간격으로 나눈다. 아주 밝은 칸은 채도를 일부러 낮춘다. HSL 사다리는 HSL 명도 96%~16%를 열 칸으로 나눈 것이다. 칸 이름 50~900은 디자인 도구에서 흔히 쓰는 관례다.)

OKLCH 사다리의 점들은 거의 곧은 대각선 위에 놓인다. 명도 차가 고르다는 뜻이다. 그래프 위 칸에 붙은 표시는 그 칸의 색을 흰 바탕 위 글자로 썼을 때 대비가 4.5:1을 넘는지를 알려 준다. 대비는 두 색의 상대 휘도로 계산한다(13장).

$$\text{대비} = \frac{Y_{\text{밝은}} + 0.05}{Y_{\text{어두운}} + 0.05}$$
\(Y\): 색의 상대 휘도(0=검정, 1=흰색). WCAG 2의 공식으로, 본문 크기 글자는 4.5 이상, 큰 글자와 아이콘은 3 이상을 권한다. 명도가 고른 사다리에서는 "몇 번 칸부터 흰 바탕 글자로 쓸 수 있는가"가 색상과 상관없이 비슷한 자리에 온다. 그래서 규칙을 칸 번호로 적을 수 있다.

이것이 지각 균일 사다리의 실용적인 장점이다. 초록 사다리든 빨강 사다리든 600번이 흰 바탕에서 4.5:1 근처에 오도록 만들어 두면, "흰 바탕 글자는 600번 이상"이라는 한 줄짜리 규칙이 모든 색에 통한다. HSL 사다리라면 색마다 그 경계가 두세 칸씩 왔다 갔다 한다.

물감 한 색으로 아홉 칸 사다리 수채 물감 한 색(번트 시에나나 프탈로 그린처럼 진한 색이 좋다)으로 가로 2 cm 칸 아홉 개를 칠한다. 맨 오른쪽은 물감을 거의 그대로, 맨 왼쪽은 물을 잔뜩 탄 옅은 칸이다. 가운데 칸을 먼저 칠하고, 그 다음 양쪽 끝의 가운데를 칠하는 식으로 반씩 나누어 가면 고른 사다리를 만들기 쉽다. 다 마르면 휴대폰 카메라의 흑백 모드로 찍어 칸 사이 밝기 차가 고른지 본다. 대부분 어두운 쪽 칸들이 뭉친다. 물감은 진할수록 조금 더 넣어도 덜 어두워지기 때문이다. 뭉친 칸을 다시 칠해 고르게 만든 사다리가 디자인 도구의 톤 스케일과 같은 일을 한다.

회색에도 온도가 있다

화면에서 가장 넓은 자리를 차지하는 색은 브랜드 색이 아니라 중립색(Neutrals)이다. 바탕, 본문 글자, 테두리, 흐린 안내 글자처럼 색상이 거의 없는 회색 계열을 말한다. 웹 화면의 대부분은 이 회색들이 칠한다. 그래서 회색을 어떻게 고르느냐가 브랜드 색보다 화면의 인상을 더 크게 좌우하기도 한다.

완전한 회색(채도 0)은 차갑고 기계적으로 느껴질 때가 있다. 많은 디자이너가 회색에 브랜드 색상을 아주 조금 섞는다. 채도로 치면 OKLCH 0.005~0.015, 화면에서 "회색인데 어딘가 초록 기운이 도는" 정도다. 7장에서 본 회색의 힘, 곧 탁한 색이 선명한 색을 살린다는 원리를 화면의 바탕에 적용하는 셈이다. 아래는 책방 E의 웹 화면을 밝은 화면과 어두운 화면으로 나란히 칠한 것이다. 회색에 섞는 색의 양을 바꿔 본다.

SIMULATOR

중립색과 어두운 화면: 같은 토큰, 다른 칸

바탕 회색(중립 50)—
어두운 화면 링크 대비—
어두운 화면 버튼 글자 대비—
해볼 것: ① 채도를 0으로 내렸다가 0.008로 되돌린다. 차이는 작지만 0.008 쪽 화면이 초록 로고와 더 한 몸처럼 보인다. ② 0.045까지 올린다. 회색이 아니라 연한 민트색 화면이 되고, 본문 글자까지 초록빛이 돌아 오히려 브랜드 초록이 묻힌다. 섞는 양은 "알아채지 못할 만큼"이 기준이다. ③ "밝은 화면의 값 그대로"를 켠다. 어두운 바탕 위에서 600번 초록 링크의 대비가 3.5로 떨어진다. 어두운 화면에서 같은 "링크" 역할은 사다리의 더 밝은 칸(400번)을 가리켜야 한다. (어두운 화면의 링크·버튼은 어두운 바탕 대비 4.5 이상인 칸 중 하나를 고른다. 이 시뮬레이터는 여유를 두어 400번을 쓴다. 화면 색은 기기마다 다르므로 실제 기기에서도 확인한다.)

어두운 화면은 밝은 화면을 뒤집은 것이 아니다. 바탕은 검정 대신 아주 어두운 회색(이 장에서는 중립 900, L* 약 8)을 쓰고, 글자는 흰색 대신 아주 밝은 회색을 쓴다. 순수한 검정 위의 순수한 흰 글자는 대비가 21:1로 너무 세서 글자 둘레가 번져 보이는 사람이 있기 때문이다. 브랜드 색도 그대로 가져가지 않는다. 같은 초록이라도 어두운 바탕 위에서는 더 어둡고 무겁게 보이므로(9장의 동시대비), 더 밝은 칸을 쓴다. 토큰이 있으면 이 일은 "어두운 화면에서 링크는 400번"이라는 화살표 하나를 바꾸는 일이 된다.

토큰 이름은 색이 아니라 쓰임으로 UI 디자이너들이 처음 토큰을 만들 때 가장 흔히 하는 실수는 토큰 이름을 green-600처럼 짓는 것이다. 그러면 버튼 색을 초록에서 청록으로 바꾸는 순간 이름이 거짓말이 된다. 토큰은 button-bg, text-muted, border-subtle처럼 그 자리가 하는 일로 이름 짓고, 색 이름은 맨 아래 사다리(green-600)에만 둔다. 또 하나의 요령은 토큰 수를 처음부터 늘리지 않는 것이다. 바탕·표면·글자·흐린 글자·테두리·주색·주색 위 글자, 일곱 개로 시작해 정말 필요할 때만 하나씩 더한다. 토큰이 마흔 개가 되면 그것은 다시 "색 마흔 개"가 된다.

상태색: 초록이 두 번 나올 때

화면에는 브랜드와 상관없이 정해진 의미를 가진 색들이 있다. "완료되었다", "주의하라", "실패했다", "참고하라"를 알리는 상태색(Status colors)이다. 관례적으로 성공은 초록, 경고는 노랑·주황, 위험은 빨강, 정보는 파랑을 쓴다. 이 관례는 신호등과 경고 표지에서 온 것이라 많은 사람에게 통하지만 보편적인 것은 아니다(12장). 그래서 상태색은 언제나 글자와 아이콘을 함께 쓴다(13장).

브랜드 색이 초록인 책방 E에는 곤란한 점이 하나 있다. "성공"의 초록과 브랜드 초록이 화면에 같이 나오면, 손님은 "예약하기" 버튼과 "예약 완료" 알림을 같은 종류로 읽는다. 선택지는 둘이다. 성공 초록을 브랜드 초록에서 색상으로 충분히 떼어 놓거나, 아예 성공에 브랜드 초록을 쓰고 버튼에는 다른 표시를 더하거나. 아래에서 성공 초록의 색상을 옮겨 가며 두 초록이 얼마나 떨어져야 구별되는지 본다.

SIMULATOR

상태색: 브랜드 초록과 성공 초록

성공 ↔ 브랜드 ΔE2000—
성공 ↔ 위험 ΔE2000—
성공 색 흰 바탕 대비—
해볼 것: ① 색상을 162°로 옮긴다. 성공 색이 브랜드 초록과 거의 같아지고(ΔE 5 안팎), "예약하기" 버튼과 "예약 완료" 알림이 한 가족처럼 보인다. ② 145°(이 장의 기본값)에서 제2색각으로 바꾼다. 성공 초록과 위험 빨강의 차이가 5~6으로 줄어든다. 일반 색각에서는 60이 넘던 차이다. ③ 그 상태에서 "아이콘과 글자 함께"를 끈다. 오른쪽 재고 목록의 점 네 개 중 둘이 무엇인지 구별하기 어렵다. 다시 켜면 모양과 글자가 그 일을 대신한다. (상태색은 OKLCH 명도·채도를 고정하고 색상만 정한 이 장의 예시값이다. 색각이상 시뮬레이션은 Machado 외(2009) 모형, 심도 1.0. ΔE2000이 대략 10을 넘으면 나란히 놓았을 때 다른 색으로 쉽게 읽힌다는 것을 이 장의 기준으로 쓴다.)

성공 초록을 브랜드보다 노랑 쪽(145° 근처)으로 옮기면 일반 색각에서는 두 초록이 구별된다. 하지만 어떤 색상을 골라도 제2색각에서 성공 초록과 위험 빨강은 가까워진다. 빨강–초록 축이 바로 그 색각에서 약해지는 축이기 때문이다. 결국 상태색의 결론은 색의 문제가 아니다. 색은 상태를 빠르게 알리는 보조 수단이고, 상태를 정확히 알리는 일은 글자와 모양이 한다.

브랜드 색은 한 벌이다

"우리 브랜드 색은 초록"이라고 할 때 그 초록은 사실 하나가 아니다. 로고에 쓰는 기준색, 화면에서 쓰는 사다리, 인쇄용 값(15장), 간판 페인트 견본이 모두 "그 초록"을 맡는다. 여기에 대개 짝이 되는 보조색 하나와 강조색 하나가 붙는다. 그리고 이 색들이 화면에서 얼마만큼씩 쓰이는지가 색 자체만큼 중요하다.

아래 그림은 같은 네 가지 색(중립 바탕, 글자, 브랜드 초록, 강조 호박색)으로 칠한 웹 화면 세 개다. 색은 같고 넓이만 다르다.

A. 브랜드 색이 바탕 강하고 무겁다 B. 중립색이 바탕 브랜드 색이 "신호"가 된다 C. 두 색이 반반 어디를 볼지 흩어진다 막대: 각 화면에서 색이 차지하는 넓이
그림 2. 같은 네 색, 다른 넓이. A는 브랜드 초록이 화면을 덮어 강렬하지만 글이 많은 페이지에서는 숨이 막힌다. B는 바탕 대부분을 중립색이 맡고 초록은 로고와 버튼에만 있어, 초록이 나오는 곳마다 "여기를 누르라"는 신호가 된다. C는 초록과 호박색이 넓이를 나눠 가져 어느 쪽이 주인공인지 알 수 없다. 실내 디자인에서 온 "60-30-10 규칙"(주조색 60%, 보조색 30%, 강조색 10%)은 이런 감각을 숫자로 적은 경험칙이다. 연구로 확인된 비율이 아니라 출발점으로 쓰는 요령이다.

대부분의 웹 화면은 B에 가깝다. 정보가 많은 화면에서 브랜드 색은 바탕이 아니라 신호로 일할 때 힘이 세다. 7장의 채도 예산(선명한 색은 화면의 10% 안팎)과 같은 이야기다. 반대로 포스터, 에코백, 간판처럼 한눈에 알아봐야 하는 곳에서는 A처럼 브랜드 색을 크게 쓰는 편이 낫다. 같은 브랜드라도 매체마다 넓이의 규칙이 다르다.

브랜드 색 한 벌을 정리할 때는 보통 다음을 함께 적는다. 기준색(로고)의 OKLCH와 hex, 화면용 톤 스케일, 밝은 바탕용·어두운 바탕용 변형(9장), 보조색과 강조색, 그리고 인쇄용 값(15장). 이 목록은 길어 보이지만, 한 번 적어 두면 간판 업체와 인쇄소와 웹 개발자가 각자 "그 초록"을 짐작으로 고르는 일을 막는다.

브랜드 색은 실물 옆에서 고른다 오래 일한 브랜드 디자이너들은 화면 위 색 고르기 도구만으로 기준색을 정하지 않는다. 가게의 나무 서가, 크라프트지 쇼핑백, 손님이 들고 다닐 검은 에코백처럼 그 색이 실제로 놓일 물건을 작업대에 모아 놓고, 후보 색을 인쇄하거나 칠한 견본을 그 옆에 대 본다. 도경이 늘 하는 말과 같다. 색은 그 옆의 색과 함께 산다. 화면 시안은 그 다음이다. 브랜드 색 후보가 셋이라면 셋 모두 같은 크기로 잘라 같은 조명 아래에서 비교하고, 고른 이유를 견본 뒤에 적어 둔다.

데이터에 맞는 팔레트

차트의 색은 장식이 아니라 숫자를 읽게 하는 도구다. 그래서 데이터 시각화 팔레트는 데이터의 종류로 고른다. 지도 제작자 신시아 브루어(Cynthia Brewer)가 지도 색 고르기 도구 ColorBrewer에서 정리한 세 갈래가 지금도 표준처럼 쓰인다.

순차크기의 순서 적다많다 · 하루 방문자 수 발산기준의 위아래 줄었다같다늘었다 · 작년 대비 범주종류의 구분 낭독회북토크그림책 시간필사 모임 순차·발산은 명도가 일하고, 범주는 색상이 일한다
그림 3. 데이터 시각화 팔레트의 세 종류. 순차 팔레트(Sequential)는 적음에서 많음으로 가는 크기를 밝음에서 어두움으로 보여 준다. 발산 팔레트(Diverging)는 가운데 기준값(0, 평균, 작년)을 밝은 회색으로 두고 양쪽으로 다른 색상이 짙어진다. 범주 팔레트(Categorical, Qualitative)는 순서가 없는 종류를 서로 다른 색상으로 나눈다. 순서가 있는 데이터에 범주 팔레트를 쓰면 독자는 어느 색이 "더 많은지" 알 수 없고, 종류에 순차 팔레트를 쓰면 있지도 않은 순서를 읽는다.

책방 E의 10월 기록으로 세 팔레트를 써 본다. 순차는 하루 방문자 수를 달력에 칠하고, 발산은 작년 같은 날과 비교한 증감을, 범주는 주별 행사 종류별 참가자를 막대로 보여 준다. 색각 단추로 각 팔레트가 다른 색각에서 어떻게 보이는지도 확인한다.

SIMULATOR

책방 E의 10월: 순차·발산·범주

가장 비슷한 두 색 ΔE2000—
명도 L* 범위—
이 데이터에 맞는 팔레트—
해볼 것: ① 순차에서 제2색각으로 바꾼다. 초록 색조는 바래지만 밝음–어두움의 순서는 그대로라 달력은 여전히 읽힌다. 순차 팔레트가 색각에 강한 이유는 명도가 일하기 때문이다. ② 단계 수를 9로 올린다. 이웃 칸이 서로 비슷해져(ΔE 7 안팎) 범례와 달력의 칸을 맞춰 보기 어렵다. 달력처럼 칸이 작은 지도는 5~7단계가 보통이다. ③ 범주에서 h₀를 40°로 옮기고 제2색각을 본다. 빨강 계열과 초록 계열 두 막대가 거의 같은 색(ΔE 1 미만)이 된다. 같은 방법으로 만든 팔레트도 출발 색상 하나에 따라 무너진다. 막대 끝에 이름을 직접 적어 두면 색이 무너져도 읽힌다. (방문자 수는 이 장이 지어낸 예시 자료다. 팔레트는 이 책의 엔진: 순차는 OKLCH 한 색상에서 명도 0.95→0.3, 발산은 파랑 250°와 주황 55°, 범주는 명도 0.64·채도 0.13에서 색상을 고르게 나눈다.)

범주 팔레트는 같은 명도·채도에서 색상만 고르게 나누는 것이 정석처럼 보이지만, 그 방법은 색상 하나에만 기대므로 색각이상에 약하다. 실제로 쓰이는 범주 팔레트들은 명도도 조금씩 엇갈리게 두어, 색상이 무너져도 밝기로 구별이 남게 만든다. 그리고 범주는 다섯에서 일곱 개를 넘으면 색만으로는 구별이 어렵다. 그보다 많으면 비슷한 것끼리 묶거나, 가장 중요한 하나만 색으로 칠하고 나머지는 회색으로 두는 편이 낫다.

차트는 회색부터 칠한다 데이터 시각화를 오래 한 사람들의 습관 하나는 차트의 모든 막대를 먼저 회색으로 칠하는 것이다. 그 다음 "이 차트가 말하려는 것"에 해당하는 막대 하나(또는 한 묶음)만 색을 준다. 책방 E의 주간 보고라면 "그림책 시간이 셋째 주에 두 배가 되었다"가 이야기이니 그 막대만 초록으로 칠한다. 색이 다섯 개인 차트는 독자에게 어디를 볼지 고르게 하고, 색이 하나인 차트는 어디를 볼지 알려 준다. 범례 대신 막대 옆에 이름을 바로 적는 것도 같은 습관이다. 눈이 범례와 막대 사이를 오가지 않아도 된다.

무지개 색지도가 속이는 법

기온 지도, 높낮이 지도, 열화상 사진처럼 값이 연속으로 이어지는 자료에는 오랫동안 무지개 색지도가 쓰였다. 파랑에서 청록, 초록, 노랑, 빨강으로 이어지는 띠다. 색이 많아 화려하고 "자세해" 보인다. 하지만 시각화 연구자들은 이 색지도가 자료를 왜곡한다고 거듭 지적해 왔다(Borland, Taylor 2007; Crameri 외 2020). 문제는 두 가지다. 명도가 값을 따라 고르게 변하지 않고, 색상의 경계가 자료에 없는 선을 그린다.

아래 그림은 왼쪽에서 오른쪽으로 완전히 고르게 올라가는 경사면에, 가운데쯤 낮은 언덕 하나를 얹은 자료다. 언덕을 끌어 옮기고, 색지도를 바꿔 본다. 아래 그래프는 각 색지도가 값 0에서 1까지 가는 동안 명도(L*)가 어떻게 변하는지 보여 준다.

SIMULATOR

무지개 색지도와 가짜 경계

언덕(손잡이)을 끈다
색지도의 명도 L*—
명도가 방향을 바꾸는 횟수—
가장 큰 걸음 ÷ 가장 작은 걸음—
해볼 것: ① 무지개에서 경사면을 본다. 자료는 고르게 올라가는데 청록과 노랑 근처에 밝은 띠가 생기고, 초록 영역은 넓게 뭉쳐 변화가 없어 보인다. 아래 그래프의 명도 곡선이 오르락내리락한다. ② 언덕을 노랑 근처로 끌었다가 초록 한가운데로 옮긴다. 같은 높이의 언덕이 어디에 놓이느냐에 따라 눈에 띄기도 하고 사라지기도 한다. ③ 비리디스 근사와 회색으로 바꾼다. 명도가 한 방향으로만 고르게 올라가서, 경사면은 경사면으로, 언덕은 어디서나 같은 크기로 보인다. "흑백" 단추를 눌러 보면 무지개의 경사면은 밝음과 어두움이 뒤섞인 띠가 된다. (무지개는 HSL 색상을 파랑 240°에서 빨강 0°까지 돌린 흔한 형태다. 비리디스 근사는 matplotlib의 viridis 색지도에서 다섯 점을 따 OKLab에서 이은 이 책의 근사이며 원본과 조금 다르다. 걸음은 64등분한 이웃 색 사이의 ΔE2000이다.)

무지개 색지도의 "걸음 비"가 크다는 것은, 같은 크기의 값 변화가 어떤 구간에서는 크게, 어떤 구간에서는 거의 안 보인다는 뜻이다. 독자는 색이 크게 바뀌는 곳에 경계가 있다고 읽는다. 자료에는 없는 경계다. 2015년 matplotlib(파이썬의 대표적인 그래프 도구)의 개발자 스테판 반 데르 발트와 나타니엘 스미스가 명도가 고르게 오르도록 설계한 viridis를 발표했고, 이 색지도는 2017년 matplotlib 2.0부터 기본 색지도가 되었다. 지금은 많은 과학 도구가 무지개 대신 이런 지각 균일 색지도를 기본으로 둔다.

왜 무지개에서 띠가 보이는가 이유는 두 겹이다. 첫째, 명도. 화면의 순수한 파랑은 L* 약 32, 청록은 약 91, 초록은 약 88, 노랑은 약 97, 빨강은 약 53이다. 값이 고르게 오르는 동안 밝기는 어두움→밝음→조금 어두움→가장 밝음→어두움으로 출렁인다. 사람의 눈은 명도 변화에 가장 예민하므로, 밝기가 꺾이는 노랑과 청록 자리에 띠가 보인다. 둘째, 색 범주. 사람은 연속된 색상을 "파랑, 초록, 노랑"처럼 이름 붙인 덩어리로 나누어 보는 경향이 있어서, 이름이 바뀌는 자리에 경계를 느낀다. 그래서 무지개는 연속 자료를 몇 개의 띠로 잘라 보이게 만든다. 거꾸로 이 성질이 쓸모 있을 때도 있다. 자료에 실제 경계(예: 0°C 어는점)가 있다면, 그 자리에서 색상을 바꾸는 발산 팔레트가 그 경계를 정직하게 보여 준다. 문제는 색지도의 경계가 자료의 경계와 상관없는 자리에 있을 때다.

사진에서 색 뽑기

팔레트를 처음부터 만들지 않고 사진이나 그림에서 뽑아 오기도 한다. 가게의 실내 사진, 좋아하는 풍경, 공공 도메인의 명화(11장)에서 주요 색 다섯 개를 뽑으면, 그 장면의 분위기를 닮은 팔레트가 나온다. 컴퓨터는 이 일을 보통 k-평균 군집(k-means clustering)으로 한다. 사진의 모든 화소를 색 공간의 점으로 찍은 뒤, 점들을 k개의 무리로 나누고 각 무리의 평균색을 대표색으로 삼는 방법이다.

아래는 책방 E의 실내를 그린 가상의 사진이다(이 장이 캔버스로 그린 그림이다). 뽑을 색의 수 k를 바꾸고, 사진 위를 눌러 스포이드로 한 점을 찍으면 그 화소가 어느 대표색에 속하는지 보여 준다.

SIMULATOR

책방 사진에서 주요 색 뽑기

사진 위를 눌러 스포이드
가장 넓은 색—
스포이드 화소—
속한 대표색 · 차이—
해볼 것: ① k=5에서 대표색을 본다. 나무 갈색, 벽의 크림색, 그림자의 짙은 갈색처럼 넓은 색이 자리를 다 차지하고, 서가에 꽂힌 붉은 책과 초록 간판은 보이지 않는다. ② 스포이드로 붉은 책 등을 찍는다. 그 화소는 갈색 대표색에 속하고 차이(ΔE)가 크다. k-평균은 넓이로 투표하는 방법이라 작은 색은 큰 무리에 흡수된다. ③ "서로 다른 색 우선"으로 바꾼다. 먼저 열네 개 무리로 잘게 나눈 뒤 서로 가장 다른 색부터 고르므로, 붉은 책과 초록 간판이 살아난다. 대신 막대가 보여 주는 넓이 비율은 실제 사진과 멀어진다. 어느 쪽이 "맞는" 팔레트인지는 쓰임에 달렸다. (k-평균은 이 책의 엔진: OKLab 공간, k-means++ 시작점, 시드 고정이라 같은 k에서는 같은 결과가 나온다. "서로 다른 색 우선"은 이 장의 간단한 방법이다. 비율 1% 미만의 무리는 고르지 않는다.)

k-평균이 뽑은 다섯 색은 그 장면을 "평균낸" 색이다. 그래서 대개 탁하고 차분하다. 사진 속에서 눈길을 끌던 작은 색(빨간 책 한 권, 창밖의 하늘)은 넓이가 작아 빠지기 쉽다. 그런데 그 장면의 인상을 만드는 것은 종종 바로 그 작은 색이다. 그래서 뽑은 팔레트는 출발점으로 쓴다. 넓은 색은 바탕과 중립색 후보로, 작은 색은 손으로 다시 골라 강조색 후보로 둔다.

뽑은 색은 그 사진의 색이다 사진에서 뽑은 색은 실물의 색이 아니라 그 사진의 색이다. 카메라의 화이트밸런스, 노출, 보정 필터가 이미 한 번 색을 바꾸었다(10장). 전구 아래에서 찍은 서점 사진은 모든 색이 주황으로 기울어 있고, 그 사진에서 뽑은 팔레트도 그렇다. 또 화면에 보이는 색은 기기마다 다르므로, 뽑은 hex 값을 실물 견본이나 인쇄 견본과 대조하기 전에는 확정하지 않는다.
눈을 가늘게 뜨고 다섯 색 고르기 잡지나 엽서에서 마음에 드는 사진 한 장을 골라 책상 위에 세운다. 한 걸음 물러나 눈을 가늘게 뜨고(세부가 뭉개져 큰 색 덩어리만 남는다) 가장 넓은 색 다섯 개를 물감이나 색종이로 만들어 넓이 순서대로 붙인다. 그 다음 눈을 크게 뜨고 "작지만 눈길을 끄는 색" 하나를 찾아 여섯 번째로 붙인다. 여섯 색을 넓이에 비례하는 막대로 다시 칠해 보면, 사진의 분위기가 막대 하나에 남아 있는지 확인할 수 있다. 시뮬레이터의 두 방식(넓이 순, 서로 다른 색 우선)을 손으로 해 본 셈이다.

팔레트를 한 장에 정리하기

지금까지 만든 것을 모으면 한 벌의 팔레트가 된다. 브랜드 사다리 열 칸, 중립 사다리 열 칸, 상태색 네 개, 데이터용 팔레트 세 종류, 그리고 이 칸들을 가리키는 토큰 표. 마지막으로 이것을 한 장으로 정리한다. 아래 표는 이 장의 케이스에서 서윤이 정리한 토큰 표의 일부다.

토큰(쓰임)밝은 화면어두운 화면점검
바탕중립 50 #f6fcf8중립 900 #151917—
본문 글자중립 900중립 100 #edf3f017.0 · 15.8
흐린 글자중립 700 #444946중립 400 #aab0ac8.8 · 8.0
주색(버튼·링크)초록 600 #2f7d5b초록 400 #5eaa854.8 · 6.4
주색 위 글자흰색중립 9005.0 · 6.4
테두리중립 200 #e0e6e3중립 700장식(대비 기준 없음)

점검 칸의 숫자는 그 토큰이 바탕 위에서 갖는 WCAG 대비다(밝은 화면 · 어두운 화면). 마지막 시뮬레이터는 이 표를 만드는 작업대다. 원판 위에서 브랜드 색을 고르면 사다리, 중립색, 토큰, 두 화면의 미리보기, 그리고 점검 목록이 한꺼번에 다시 계산된다. 원판은 OKLCH의 한 단면(가운데 회색, 바깥으로 갈수록 선명, 둘레를 돌면 색상)이다.

SIMULATOR

팔레트 작업대: 색 하나에서 한 벌까지

원판 위 손잡이를 끈다
브랜드 기준색—
밝은 화면 버튼 글자—
어두운 화면 주색—
점검 통과—
해볼 것: ① 처음 상태는 책방 E의 초록 #2f7d5b다. 점검 여섯 개가 모두 통과한다. 제2색각으로 바꾸면 "상태색 구분(색만으로)"이 걸린다. 상태색에 글자·아이콘이 필요하다는 뜻이다. ② 명도를 0.56 이상으로 올린다. 조금 더 밝고 산뜻한 초록이 되지만, 흰 글자를 얹은 버튼의 대비가 4.5 밑으로 떨어진다. 밝은 브랜드 색은 버튼 바탕보다 강조 장식에 어울린다. ③ 손잡이를 원판 가장자리 가까이, 빨강 쪽(25° 근처)으로 옮긴다. 이제 브랜드 색과 "위험" 빨강이 부딪친다(점검 "브랜드 ↔ 위험"). 브랜드 색이 바뀌면 상태색도 다시 봐야 한다. (사다리·중립색·토큰 규칙은 이 장 본문의 규칙을 그대로 쓴다. 어두운 화면 주색은 어두운 바탕 대비 4.5 이상인 칸 중 가장 어두운 칸보다 한 칸 밝은 칸을 고른다. 화면 색은 기기마다 다르다.)

작업대에서 몇 가지를 움직여 보면, 팔레트의 품질이 색 하나의 아름다움보다 규칙이 얼마나 잘 버티는가에 달려 있다는 것이 보인다. 좋은 팔레트는 브랜드 색을 조금 바꾸어도, 어두운 화면으로 넘어가도, 다른 색각으로 보아도 점검 목록이 크게 무너지지 않는다. 그리고 무너지는 지점이 어디인지 미리 알고 있다. 서윤이 이번 장에서 만든 것도 그런 규칙의 묶음이다.

서윤의 작업 노트

CASE 서윤작업 노트 · 14장

초록 하나를 한 벌로: 웹 팔레트 v1

웹사이트 개발을 맡은 프리랜서 개발자가 서윤에게 물었다. "초록 버튼 눌렀을 때 색은요? 비활성 버튼은요? 어두운 화면은요? 시안마다 초록이 조금씩 달라서 어느 걸 써야 할지 모르겠어요." 서윤이 시안 파일을 열어 세어 보니 초록이 아홉 가지였다. 그동안 장마다 정한 원칙(브랜드 색은 OKLCH로 기록, 글자·버튼 대비 4.5:1 이상, 상태 표시에 글자·모양 함께)은 있었지만 그것을 한 장의 팔레트로 묶은 적은 없었다.

서윤은 후보 초록 #2f7d5b(OKLCH 0.53 / 0.094 / 162°)를 600번 칸에 두고, 위로 명도 0.97까지 여섯 칸, 아래로 0.29까지 세 칸을 고르게 나눈 사다리를 만들었다. 3장에서 만든 아홉 단계를 디자인 도구의 관례(50~900)에 맞춰 열 칸으로 다시 나눈 것이다. 이 책의 모델로 계산하면 50 #edf8f2, 100 #c4e7d4, 200 #9dd4b7, 300 #7ac09d, 400 #5eaa85, 500 #479370, 600 #2f7d5b, 700 #0f6545, 800 #004d32, 900 #003521이다. 흰 바탕에서 600번이 대비 4.99, 700번이 7.05다. 이웃 칸의 명도 차(L*)는 8~10으로 고르다. 중립색은 같은 색상 162°에 채도 0.008만 섞은 열 칸(50 #f6fcf8 … 900 #151917)으로 했다. 도경은 화면을 보고 "회색에 초록 물을 한 방울 떨어뜨렸구나. 수채화에서 회색 섞을 때 하는 짓이랑 똑같네" 하고 웃었다.

상태색에서 걸렸다. 처음 정한 성공 초록이 브랜드 초록과 거의 같아서 "예약하기" 버튼과 "예약 완료" 알림이 한 종류로 보였다. 서윤은 성공을 색상 145°의 #38853e(흰 바탕 대비 4.59, 브랜드와 ΔE2000 9.3)로 옮기고, 경고 #e49e22, 위험 #c53732, 정보 #2a75ba를 같은 방식으로 정했다. 제2색각 시뮬레이션에서 성공과 위험의 차이가 5.6으로 줄어드는 것을 보고, 13장의 원칙대로 모든 상태 표시에 아이콘과 글자를 붙였다. 경고 호박색은 흰 바탕 대비가 2.27이라 글자색으로는 쓰지 않고 아이콘과 띠에만 쓴다. 로고는 이 사다리와 따로, 9장에서 정한 바탕별 변형을 그대로 쓴다. 사다리는 버튼·링크·배지 같은 화면 부품의 몫이다.

행사 달력과 방문자 차트는 따로 정했다. 하루 방문자 수 달력은 브랜드 색상의 순차 팔레트 5단계(#cffbe3 → #0e3625), 작년 대비 증감은 파랑–주황 발산 팔레트로 했다. 브랜드 초록과 빨강으로 발산 팔레트를 만들면 제2색각에서 양 끝이 비슷해지기 때문이다. 행사 종류(낭독회·북토크·그림책 시간·필사 모임)는 범주 팔레트 h₀=15°의 네 색 #cf6872 #989016 #00a3a4 #857fd7를 골랐다. 이 책의 모델로 계산하면 제2색각에서도 가장 가까운 두 색의 ΔE가 13이다. 처음 시도한 h₀=40°는 제2색각에서 두 색이 0.8로 겹쳐 버렸다. 막대에는 범례 대신 이름을 직접 적는다.

마지막으로 서점 실내 사진에서 k-평균으로 다섯 색을 뽑았다. 나무 서가와 그림자의 짙은 갈색, 전구 빛을 받은 벽의 베이지와 황갈색이 나왔고, 서가의 붉은 책 등은 "서로 다른 색 우선"으로 바꾸어야 나타났다. 서윤은 이 색들을 확정하지 않고 "보조색·강조색 후보"로만 적어 두었다. 사진이 전구색 조명 아래에서 찍혀 모든 색이 주황으로 기울어 있다는 것을 10장에서 배웠기 때문이다.

이 장에서 정한 것웹 팔레트 v1: 초록 사다리 10칸(600=#2f7d5b), 중립 10칸(C 0.008), 상태색 4개(아이콘·글자 필수), 토큰 표(밝은 화면 주색 600, 어두운 화면 주색 400), 차트용 순차·발산·범주 팔레트. 브랜드 기준색은 여전히 후보다.
아직 남은 문제이 초록 사다리는 화면의 값이다. 포스터와 쇼핑백에 인쇄하면 같은 초록이 나올까. 사진에서 뽑은 따뜻한 보조색 후보는 어디에 쓸까.
다음 단계15장: 가을 행사 포스터를 인쇄소에 넘기기 전에 초록이 인쇄에서 어떻게 변하는지 본다.

핵심 정리

  1. 디자인 팔레트는 세 층으로 짓는다. 색 값의 사다리(톤 스케일), 쓰임의 이름(의미 토큰), 토큰으로 칠한 부품. 색이 바뀌면 사다리만, 어두운 화면에서는 토큰이 가리키는 칸만 바꾼다.
  2. 톤 스케일은 HSL이 아니라 OKLCH 같은 지각 균일 공간에서 명도를 고르게 나눈다. 그러면 "흰 바탕 글자는 600번 이상" 같은 규칙이 모든 색상에 통한다. 사다리 양 끝은 색역 때문에 채도가 줄어든다.
  3. 중립색에 브랜드 색상을 알아채지 못할 만큼(OKLCH 채도 0.005~0.015) 섞으면 화면이 한 몸처럼 보인다. 어두운 화면은 반전이 아니라, 더 밝은 칸을 가리키는 별도의 토큰이다.
  4. 상태색은 브랜드 색과 충분히 떨어뜨리되, 어떤 색을 골라도 색각에 따라 가까워질 수 있으므로 늘 글자와 아이콘을 함께 쓴다.
  5. 데이터 시각화 팔레트는 데이터의 종류로 고른다. 크기는 순차, 기준의 위아래는 발산, 종류는 범주. 순차·발산은 명도가, 범주는 색상이 일한다.
  6. 무지개 색지도는 명도가 오르내리고 색상 이름이 바뀌는 자리마다 자료에 없는 경계를 만든다. 연속 자료에는 명도가 한 방향으로 고르게 변하는 색지도를 쓴다.
  7. k-평균으로 뽑은 색은 넓이로 투표한 결과라 작고 눈에 띄는 색을 놓친다. 뽑은 팔레트는 출발점이며, 그 사진의 조명과 보정이 들어 있다.

확인 퀴즈

1. 웹사이트 버튼 색 토큰의 이름으로 green-600보다 button-bg가 나은 가장 큰 이유는?

토큰은 "그 자리가 하는 일"의 이름이고, 실제 색 값은 사다리에 있다. 버튼을 청록으로 바꾸면 green-600이라는 이름은 거짓이 되지만 button-bg는 여전히 맞다. 어두운 화면에서 같은 토큰이 400번을 가리키게 바꾸는 것도 이름을 건드리지 않고 할 수 있다. WCAG는 대비 수치를 정할 뿐 토큰 이름과는 상관이 없다.

2. 고르게 올라가는 기온 자료를 무지개 색지도(파랑→청록→초록→노랑→빨강)로 칠했더니 노랑과 청록 근처에 띠가 보였다. 가장 알맞은 설명은?

자료는 고르게 올라가므로 첫 번째 보기는 틀리다. 무지개 색지도는 색이 오히려 많고, 순수한 노랑과 청록은 sRGB 안의 색이다. 띠의 원인은 명도의 출렁임(파랑 L* 약 32 → 청록 약 91 → 초록 약 88 → 노랑 약 97 → 빨강 약 53)과, 색상 이름이 바뀌는 자리에서 경계를 느끼는 지각의 성질이다.

3. 책방 E의 "작년 같은 날 대비 방문자 증감(−40%~+40%)"을 달력에 칠하려고 한다. 가장 알맞은 팔레트는?

기준값(0)의 위아래를 보여 주는 자료이므로 발산 팔레트가 맞다. 순차 팔레트를 쓰면 −40%가 "가장 적다"로만 읽혀 0이 어디인지 보이지 않는다. 범주 팔레트는 순서가 없어 어느 색이 더 늘었는지 알 수 없다. 색을 하나만 쓰면 색이 아무 정보도 전하지 않는다.

4. 서점 사진에서 k-평균으로 주요 색 4개를 뽑았더니 서가에 꽂힌 빨간 책의 색이 빠졌다. 그 이유와 대처로 가장 알맞은 것은?

k-평균은 모든 화소를 색 공간의 점으로 놓고 가까운 것끼리 묶어 평균을 내므로, 넓이가 작은 색은 비슷한 넓은 무리(갈색 서가)에 섞여 사라진다. 이 책의 엔진은 시드를 고정해 같은 입력에서 같은 결과를 내므로 다시 돌려도 같다. 빨강을 못 알아보는 것도, 색역 밖의 색인 것도 아니다.