본문 바로가기

카테고리 없음

논문용 색깔 팔레트 (color palette for scientific paper)

728x90
반응형

1. 개요

논문의 그래프는 검정 하양색만으로 그리면 너무 단순하다고 듣기 쉽고 너무 화려한 색을 쓰면 어지럽다는 말을 듣기 쉽다.

또한, 색깔 조합을 적절히 하느냐는 논문의 임팩트 팩터에도 영향을 준다는 말도 있다. 이러한 연구자들을 위해 각 저널들에서 자주 사용되는 색깔을 정리한 패키지가 있어서 이것을 다뤄볼까 한다.

 

2. 내용.

 출처는 아래 사이트에 있다.

https://cran.r-project.org/web/packages/ggsci/vignettes/ggsci.html

 

Scientific Journal and Sci-Fi Themed Color Palettes for ggplot2

Introduction My eyes were finally opened and I understood nature. I learned at the same time to love it. — Claude Monet ggsci offers a collection of high-quality color palettes inspired by colors used in scientific journals, data visualization libraries,

cran.r-project.org

 

R의 ggplot2에서 헥사코드 (hexacode)를 가져올 수 있을텐데 BMJ의 경우 아래 사이트에 정리가 되어 있다.

https://technology.bmj.com/living-style-guide/colour.html

 

BMJ Living Style Guide - colour

When using a primary color in your palette, this color should be the most widely used across all screens and components.

technology.bmj.com

 

'''
이 파이썬 스크립트는 논문들에서 사용되는 색깔을 저장해둔 것이다.
전체는 아니고 내 개인적으로 괜찮은 것들만 추린 것이다.
'''

class paper_color:
    '''
    이것은 어떤 색깔을 쓸지 지정하는 것이라고 생각하면 됨.
    색깔의 수는 기능 뒤의 숫자로 적혀있음. 예를들어 npg10은 10개라는 뜻임.
    '''
    def __init__(self,color_code='npg'):
        self.color_code=color_code
        def npg10():
            '''
            nature publishing group의 색깔 10개
            '''
            npg_color="#E64B35FF,#4DBBD5FF,#00A087FF,#3C5488FF,#F39B7FFF,#8491B4FF,#91D1C2FF,#DC0000FF,#7E6148FF,#B09C85FF"
            npg_color=npg_color.split(',')
            return npg_color
        self.npg10=npg10
        def bmj9():
            '''
            bmj의 색깔 9개
            '''
            bmj_color="#2A6EBBFF,#F0AB00FF,#C50084FF,#7D5CC6FF,#E37222FF,#69BE28FF,#00B2A9FF,#CD202CFF,#747678FF"
            bmj_color=bmj_color.split(',')
            return bmj_color
        self.bmj9=bmj9
        def science10():
            '''
            science journal의 10개 색깔
            American Association for the Advancement (AAAS)
            '''
            sci_color="#3B4992FF,#EE0000FF,#008B45FF,#631879FF,#008280FF,#BB0021FF,#5F559BFF,#A20056FF,#808180FF,#1B1919FF"
            sci_color=sci_color.split(',')
            return sci_color
        self.science10=science10
        def nejm8():
            '''
            nejm의 8개 색깔
            '''
            nejm_color="#BC3C29FF,#0072B5FF,#E18727FF,#20854EFF,#7876B1FF,#6F99ADFF,#FFDC91FF,#EE4C97FF"
            nejm_color=nejm_color.split(',')
            return nejm_color
        self.nejm8=nejm8
        def lancet10():
            '''
            lancet color palette
            '''
            lancet_color="#00468BFF,#ED0000FF,#42B540FF,#0099B4FF,#925E9FFF,#FDAF91FF,#AD002AFF,#ADB6B6FF,#1B1919FF"
            lancet_color=lancet_color.split(',')
            return lancet_color
        self.lancet10=lancet10
        def jco10():
            '''
            journal of clinical oncology color palettes
            '''
            jco_color="#0073C2FF,#EFC000FF,#868686FF,#CD534CFF,#7AA6DCFF,#003C67FF,#8F7700FF,#3B3B3BFF,#A73030FF"
            jco_color=jco_color.split(',')
            return jco_color
        self.jco10=jco10
        def observable10():
            '''
            Observable 10 color palette
            Pettiross J (2023). "Crafting data colors and staying on brand." Observable blog. https://observablehq.com/blog/crafting-data-colors
            '''
            obs_color="#4269D0FF,#EFB118FF,#FF725CFF,#6CC5B0FF,#3CA951FF,#FF8AB7FF,#A463F2FF,#97BBF5FF,#9C6B4EFF,#9498A0FF"
            obs_color=obs_color.split(',')
            return obs_color
        self.observable10=observable10
    def palette(self):
        if self.color_code in ['npg','Nature','nature','NPG']:
            self.color=self.npg10()
        elif self.color_code in ['observable','obs','OBS']:
            self.color=self.observable10()
        elif self.color_code in ['BMJ','bmj']:
            self.color=self.bmj9()
        elif self.color_code in ['JCO','jco','clinical oncology','oncology']:
            self.color=self.jco10()
        elif self.color_code in ['nejm','NEJM']:
            self.color=self.nejm8()
        elif self.color_code in ['lancet','LANCET','Lancet']:
            self.color=self.lancet10()
        else:
            print('available colors are')
            print('npg, observable, bmj, jco, nejm, lancet')
            error
        return self.color
    def show(self):
            '''
            palette를 보여주기 위한 스크립트
            '''
            import numpy as np
            import matplotlib.pyplot as plt
            from matplotlib.colors import to_rgba_array
            self.color=self.palette()
            palette = np.array(to_rgba_array(self.color))[np.newaxis, :,:]
            plt.imshow(palette)
            plt.xticks(ticks=range(len(self.color)),labels=self.color,rotation=-45,ha='left')
            plt.title(self.color_code)
            plt.yticks([])
            plt.show()

 

3. 사용

default값은 npg이지만 observable로 변환시에는 아래와 같이 나온다.

pc=paper_color(color_code='obs')
pc.palette()

# 출력물은 아래와 같다.
['#4269D0FF', '#EFB118FF', '#FF725CFF', '#6CC5B0FF', '#3CA951FF',
'#FF8AB7FF', '#A463F2FF', '#97BBF5FF', '#9C6B4EFF', '#9498A0FF']

 

위의 팔레트의 색깔을 보고 싶으면 .show()를 실행하면 된다.

pc=paper_color(color_code='obs')
pc.show()

pc.show() 실행 후 예

 

4. 색 옵션들

728x90
반응형