[Matplotlib] 09. Plot Accessary: Color Map (part1)

in kr-python •  7 years ago 

09. Plot Accessary: Color Map (part1)

전편에서 다뤘던 imshow()와 같은 2차원 시각화 기능에서 가장 중요한 요소중에 하나는 역시 색깔의 적절한 선택이겠죠. Matplotlib에는 여러 종류의 Color Map이 내장되어있어, 원하는 종류를 골라 쓰면 되겠습니다.

현재 내재된 색지도는 아래 사이트에서 확인하실 수 있습니다.
https://matplotlib.org/examples/color/colormaps_reference.html
(제일 상단의 "Perceptually Uniform Sequential Colormaps"는 최신 버전에 추가되어서 여러분이 설치한 Matplotlib에는 없을 수도 있습니다. "일관적으로 인지되는" 색에 대해서는 마지막에 다시 언급하도록 하겠습니다.)

전편 08. Plot Main: Imshow에서 구현된 Screen Shot 2018-03-26 at 10.22.41 AM.png를 다시 이용하여 여러가지 색의 효과에 대해 알아보겠습니다.

import sys
import numpy as np
import matplotlib.pyplot as plt
#from matplotlib.ticker import AutoMinorLocator, MultipleLocator

###--- Synthesizing data to be plotted ---###
xlin = np.linspace(-2,4,121)
ylin = np.linspace(-3,5,161)    
X,Y = np.meshgrid(xlin,ylin)
## Z = 1/(e^((X/3.)^2+(Y/5.)^2))
Z = 1./(np.exp((X/3.)**2+(Y/5.)**2))

cmap_names=['YlOrBr', 'RdPu', 'YlGnBu', 'bone', 'spring', 'cool', 'hot', 'PuOr', 'Spectral', 'seismic', 'Dark2', 'terrain', 'CMRmap', 'nipy_spectral', 'jet', 'rainbow']

###--- Plotting Start ---###
##-- Page Setup --##
fig = plt.figure()            # Define "figure" instance
fig.set_size_inches(10,12)    # Physical page size in inches, (lx,ly)
suptit="Color Map Example"
fig.suptitle(suptit,fontsize=18)   # Title for the page
fig.subplots_adjust(left=0.,right=1.,bottom=0.1,top=0.92,wspace=-0.1,hspace=0.25)

##-- Plotting for axis1 --##
for i in range(16):
    ax = fig.add_subplot(4,4,i+1)   # subplot(# of rows, # of columns, indicater)
    pic1 = ax.imshow(Z,origin='lower',cmap=cmap_names[i],interpolation='nearest')     

    subtit='({}) {}'.format(i+1,cmap_names[i])
    ax.set_title(subtit,fontsize=14,x=0.,ha='left')
    ax.set_xticks(np.linspace(0,len(xlin)-1,4))
    ax.set_xticklabels([-2,0,2,4])
    ax.set_yticks(np.linspace(0,len(ylin)-1,5))
    ax.set_yticklabels([-3,-1,1,3,5])
    ax.tick_params(axis='both',which='major',labelsize=10)

##-- Seeing or Saving Pic --##
#plt.show()   #- If want to see on screen -#
outdir = "./"
outfnm = outdir+"09_plot_accessary.ColorMap01.png"     # File format is decided by the file name, eg. png here
#fig.savefig(outfnm,dpi=100,facecolor='0.9',bbox_inches='tight')   # dpi: pixels per inch
fig.savefig(outfnm,dpi=100,facecolor='0.9')   # dpi: pixels per inch

sys.exit()

위 프로그램을 실행시키면 아래와 같은 그림이 나옵니다.

09_plot_accessary.ColorMap01.png

보시는 바와 같이 어떤 색지도를 쓰냐에 따라 같은 자료도 시각화된 느낌이 다릅니다. 이용자 입장에서는 자신의 자료에서 어떤 부분을 부각시키고 감추고 싶은지에 따라 적절한 색지도를 골라야 겠습니다. 해석하는 사람 입장에서는 색에 현혹되지 않도록 ColorBar를 통해 어떤 색이 어떤 값을 가리키는지 적절히 판단을 해야겠죠. (ColorBar는 다음편 part2에서 이어서 다루도록 하겠습니다.)

더하여 각각의 색지도를 뒤집기는 간단히 색지도 이름 끝에 "_r"만 붙이면 됩니다. 예를 들면 "jet"은 값이 증가함에 따라 파란색에서 빨간색으로 변화하는데, "jet_r"은 빨간색에서 파란색으로 증가하게 됩니다. 뒤집혀진 색지도의 예는 아래 그림을 보시면 되겠습니다.

09_plot_accessary.ColorMap02.png


색지도의 선택에 있어서 무조건 화려한 색상만이 좋은 것은 아닙니다. 물론 가장 중요한 것은 자료의 특색을 가장 잘 나타내는게 중요합니다. 여기에 더하여 혹시 흑백으로 출력되는 것을 고려하거나 아니면 Color Blind 색맹인 사람들을 고려한다면 선택할 수 있는 색지도는 제한되는 편입니다. 참고할 페이지는 여기입니다: https://matplotlib.org/users/colormaps.html#choosing-colormaps

  1. 흑백 출력 고려
    흑백 출력은 RGB의 조합인 고유한 색상이 밝기로 변환된다는 것을 뜻합니다. Sequential 색지도의 경우에는 대부분 별 문제가 없으나 Diverging 색지도는 대체로 매우 취약합니다.

    위 참고 사이트에서 가져온 그림을 보면 대부분의 Diverging 색지도의 경우 흑백으로 변환되면 좌/우의 구분이 안되는 것을 알 수 있습니다.

  2. 일관된 인지가 가능한 색 (Perceptually Uniform Colormap)
    색을 빨강-녹색-파랑 (RGB)이 조합으로 나타내는 것은 컴퓨터 시각화에서 역사도 깊고 널리 쓰이는 방식입니다. 하지만 문제는 RGB의 색공간이 균일하지가 않다는 점입니다.

    [From https://en.wikipedia.org/wiki/Color_difference#Tolerance]
    따라서 자료의 값이 1->2->3->4로 변할 때 색이 빨->주->노->초로 변한다면 자료 값들의 차이는 일정함에도 색으로 인지되는 값은 일정하지 않게 느껴지게 됩니다. 이런 문제를 해결하고자 나온 색지도가 "Perceptually Uniform Colormap"입니다.

  3. 색맹인 사람들을 위한 고려
    (아래 내용은 http://www.somersault1824.com/tips-for-designing-scientific-figures-for-color-blind-readers/ 에서 가져온 내용임을 밝힙니다)

Screen Shot 2018-04-06 at 11.46.32 AM.pngScreen Shot 2018-04-06 at 11.46.47 AM.png
위 웹페이지에 따르면, 안좋은 색조합으로 녹+갈, 청+자주, 녹+청, 연녹+노랑, 청+회색, 녹+회색, 녹+검정 등이 있다고 합니다.

Screen Shot 2018-04-06 at 11.49.37 AM.png

그리고 http://hclwizard.org/hclwizard/ 여기를 방문하시면 색맹에 취약하지 않은 적절한 색 모음을 Raw값이나 Python 혹은 Matlab 형식에 맞게 가져올 수 있습니다.

이상 Color Map 색지도의 종류에 대하여 알아보았습니다.
다음에는 Color Map을 정규화하는 방식과 Color Bar에 대하여 알아보도록 하겠습니다.


"""
제 개인적 목표는

  1. Object-Oriented Programming과 친해지기
  2. Github와 친해지기 입니다.

이 목표에 닿기 위해 일단 제가 나름 좀 아는 Python, 그 중에서도 NumpyMatplotlib로부터 시작하려 합니다.
"""

List

[Matplotlib] 00. Intro + 01. Page Setup
[Matplotlib] 02. Axes Setup: Subplots
[Matplotlib] 03. Axes Setup: Text, Label, and Annotation
[Matplotlib] 04. Axes Setup: Ticks and Tick Labels
[Matplotlib] 05. Plot Accessories: Grid and Supporting Lines
[Matplotlib] 06. Plot Accessories: Legend
[Matplotlib] 07. Plot Main: Plot
[Matplotlib] 08. Plot Main: Imshow
[Matplotlib] 09. Plot Accessary: Color Map (part1)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

재밌어요 ㅎㅎ 나중에 따라해봐야겠...

평소에 그림은 잘 안그리시나봐요... :)

그림은 그리시는 분이 따로 ㅎㅎ

This post has received a 2.42 % upvote from @booster thanks to: @dj-on-steem.

booster: 1.5 SBD
99.94% (4min to 100%)에 글 포스팅, 19(!)분만에 보팅.
전체 대기 물량은 60.34SBD+1.78Steem.
스팀가격 $1.77, 스파 903,792.414, 100% 보팅시 $109.27일 때,
보팅 2.42% 받아서 $2.7 받음.
보팅/투자=180%

therising: 1 SBD
99.93% (5min to 100%)에 글 포스팅, 9분만에 보팅.
전체 대기 물량은 40SBD (estimated, tracker is not working).
스팀가격 $1.77, 스파 676,533.903, 100% 보팅시 $81.79일 때,
보팅 2.5% 받아서 $2.02 받음.
보팅/투자=202%

총평:
booster는 100% 완료 후에 보팅될 때 까지 오래걸림.
therising은 steembot tracker에서 대기 물량이 제대로 추적되지가 않음. 따라서 깜깜이 투자를 하게됨. 물론 booster처럼 제대로 추적이 되어도 막판 러쉬 물량으로 예상보다 보팅 비율이 많이 떨어지는 현상 발생. 내가 막판 4분 전에 했는데, 내 이후에도 10명이 도합 12SBD를 투하.

예전에 영상처리 공부할때 이런 걸 왜 몰랐지 좋은거 보고 갑니다.

좋게 봐주셔서 고맙습니다 ^^

Loading...