damyarou

python, GMT などのプログラム

Python 色見本作成(matplotlibで使える色名)

記事の最後に行く

matplotlibで使える色名前の見本作成プログラム

  • コマンド matplotlib.colors.cnames により、色名・16進数のペアが辞書形式で得られますので、これを処理していきます。
  • 色短冊の中には、色名、16進数、RGBを表示していますが、発色は16進数で指定しています。
  • 関数mainの最後で、画像貼り付け用に、ImageMagickコマンドをsubprocessで実行し、余白削除を行っています。
import matplotlib.pyplot as plt
import matplotlib
import subprocess


def cols(ssrgb):
    # definition of text color
    s=(ssrgb.lstrip('(')).rstrip(')')
    text=s.split(',')
    r=int(text[0])
    g=int(text[1])
    b=int(text[2])
    r1=abs(255-r) # r of opposite color
    g1=abs(255-g) # g of opposite color
    b1=abs(255-b) # b of opposite color
#    colstr='#{0:02x}{1:02x}{2:02x}'.format(r1,g1,b1)
    colstr='#000000'
    if int(255*3/2)<r1+g1+b1: colstr='#ffffff' 
    if 250<g+b: colstr='#000000'
    if r+g==0: colstr='#ffffff'
    return colstr


def drawfig(scol,shex,srgb):
    # drawing of color strip with color name
    fsz=10
    xmin=0.0; xmax=4.0
    ymin=0.0; ymax=20.0
    k=-1
    for nnn in [1,2]:
        if nnn==1:
            i1=0
            i2=20
        if nnn==2:
            i1=20
            i2=40
        plt.figure(figsize=(10,12))
        plt.rcParams['font.size']=fsz
        plt.rcParams['font.family']='sans-serif'
        plt.xlim([xmin,xmax])
        plt.ylim([ymax,ymin])
        plt.axis('off')
        for i in range(i1,i2):
            for j in range(0,4):
                k=k+1
                if k<len(scol):
                    x1=float(j); y1=float(i-i1)
                    x2=x1+1.0  ; y2=y1
                    x3=x2      ; y3=y2+1.0
                    x4=x1      ; y4=y3
                    plt.fill([x1,x2,x3,x4,x1],[y1,y2,y3,y4,y1],color=shex[k],alpha=1.0)
                    colstr=cols(srgb[k])
                    ss=scol[k]+'\n'+shex[k]+' '+srgb[k]
                    plt.text(0.5*(x1+x2),0.5*(y2+y3),ss,ha='center',va='center',color=colstr,fontsize=fsz)
        fnameF='fig_col_py'+str(nnn)+'.jpg'
        plt.savefig(fnameF, dpi=200, bbox_inches="tight", pad_inches=0.0)
        plt.show()            


def main():
    # obtain pairs of color name and hexadecimal as a dictionary
    dic=matplotlib.colors.cnames
#    print(len(dic))
#    print(dic)
    scol=[] # list for color name
    shex=[] # list for hexadecimal expression
    srgb=[] # list for RGB expression
    for vcol,vhex in zip(dic.keys(),dic.values()):
        n1=int(vhex[1:3],16) # r in to decimal
        n2=int(vhex[3:5],16) # b in decimal
        n3=int(vhex[5:7],16) # g in decimal
        vrgb='('+str(n1)+','+str(n2)+','+str(n3)+')'
        scol=scol+[vcol]
        shex=shex+[vhex]
        srgb=srgb+[vrgb]
    drawfig(scol,shex,srgb)
    cmd1='convert fig_col_py1.jpg -trim fig_col_py1.jpg'
    cmd2='convert fig_col_py2.jpg -trim fig_col_py2.jpg'
    subprocess.call(cmd1,shell=True)
    subprocess.call(cmd2,shell=True)

    
#==============
# Execution
#==============
if __name__ == '__main__': main()

色見本の出力結果

はてなブログにアップするため、2分割で出力しています。

f:id:damyarou:20190429080159j:plain f:id:damyarou:20190429080217j:plain

Thank you.

記事の先頭に行く