그래프를 그릴 때 막대 혹은 선 끼리 다르게 보이게 하려면 막대와 선의 색상 선정을
고민해야 합니다. Color
for Designer (저자: Jim Krause) 에서는 빛의 3원색 원리를 이용해서 고르게 분포된 12개의 색깔을 보여 줍니다.
Red, Blue, Yellow를 primary color라고 하고 이들 중간에 있는 색을 secondary color라고 하는데 여기에 속하는 색을
oracle, green 그리고 violet이라고 정리했습니다. 위키피디아에서는 violet 대신에 purple 을 끼워 넣습니다.
primary
color와 secondary color 사이에 색을
tertiary color라고 칭합니다.
red, red-orange, orange, yellow-orange,yellow,yellow-green,
green,blue-green,blue, blue-violet,violet,red-violet 이름의 12개 색상을 만듭니다.
https://www.colorhexa.com/
에 위 이름의 색상을 넣으면 RGB 값을 얻을 수 있습니다. 그러나 여기에 나온 대로 하면 red-orange는 red와 구분이 안되고 yellow-orange는 orange와 구별이 안돼서 이 두 색깔은 화면에 나타나는 결과를 보고 아래 소스에 있는 대로 각각 “#ff6b20”와 “#ffcc00”로 수정했습니다. 이렇게 구한 12개 색상으로 그린 그래프 예입니다.
2019년 한국이 국가별 수산물 수입량(단위 달러) 중에 상위 12개국만 표시합니다.
아래는 해당 프로그램입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import matplotlib.pyplot as plt dollors = [[0]*12 for i in range(12)] top12 = ['CN','RU','VN','NO','US','PE','TH','JP','CL','CA','TW','IN'] colors = ['#ff0000', '#ff6b20', '#ffa500', #red,red-orange,orange '#ffcc00', '#ffff00', '#9acd32', #yellow-orange,yellow,yellow-green '#00ff00', '#0d98ba', '#0000ff', #green,blue-green,blue '#8a2be2', '#ee82ee', '#c71585'] #blue-violet,violet,red-violet fr = open("2019-korea-import.txt", encoding='utf-8') while True: line = fr.readline() if not line: break trans = line.split(',') if trans[2] != "'I'": continue country = trans[1].replace("'", "") if country in top12: ind = top12.index(country) month = int(trans[0][5:7]) - 1 dollors[ind][month] = float(trans[7].replace("'", "")) months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] for t in top12: i = top12.index(t) plt.plot(months, dollors[i], linewidth=4, label=t, c=colors[i]) plt.legend() plt.show() |
Matplotlib는 띄엄띄엄(discrete)
나오는 색상으로 기본적으로는 10개만 제공합니다. 위 프로그램 27번째 줄에서c=colors[i]를 제거하면 10개까지는 다른 색이고 11번째부터는 앞서
나왔던 색을 반복합니다.
RGB 값을 변화시키면 다음과 같은 스펙트럼을 볼 수
있습니다.
R, G, B를 순차적으로 변화시켰지만
Red, Green 그리고 Blue 자체 원색에 편중됨을 볼 수 있습니다. 구별되는 색상을 선택하기가 쉽지 않습니다. https://matplotlib.org/gallery/color/named_colors.html 에 보면 이름으로 사용 가능한 148개의 색상이 있습니다. 흰색에 가까워 구별하기 어렵고 다른 것과도 차별이 없는
것을 제외하면 쓸 만한 색상은 이보다 훨씬 적습니다. 색상을 띄워 놓고 보는 디스플레이와 주관적인 느낌에 따라 다르겠지만 이 중에 23개 정도의 색깔만 서로 구별되는 듯 합니다.
위 내용을 출력하는 프로그램은 아래에 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import matplotlib.pyplot as plt import matplotlib.colors as mcolors ax = plt.gca() ax.yaxis.set_visible(False) ax.xaxis.set_visible(False) ax.set_axis_off() ax.set_xlim(0, 60) colors = mcolors.CSS4_COLORS selected = ['silver','lightcoral','maroon', 'red','peru','tan','orange','gold', 'yellow','greenyellow', 'limegreen','green','aquamarine','lightseagreen', 'deepskyblue','dodgerblue', 'blue','slateblue','darkviolet', 'violet', 'magenta','deeppink','pink'] y = 0 for c in selected: plt.text(42, y, c, fontsize=11, horizontalalignment='left', verticalalignment='center') plt.hlines(y, 0, 40, color=colors[c], linewidth=12) y += 10 plt.show() |
댓글 없음:
댓글 쓰기