matplotlib 색상 목록 만들기

15607 단어 파이썬matplotlib

소개



최근에는 취미라도 일이라도, 계산은 거의 Python으로 실시하고 있어 그래프화도 Python matplotlib로 실시하고 있다. 그래프에는 식별성을 높이기 위해, 색을 사용하게 되지만, matplotlib의 색 일람을 수중에 두고 싶다고 생각해, 색 일람의 화상을 작성했다.

작례





만드는 방법



이하를 참고로 matplotlib로 취급할 수 있는 색 일람을 취득한다. 사전 형식으로 색상 이름과 16진수 값을 얻을 수 있습니다.

matplotlib로 지정할 수있는 색상의 이름과 목록

그리고는 fill 를 사용해 지정한 구형 영역을 채워 갈 뿐이다.

그러나, 그래프 작성시에 이것을 참조해 색 지정을 실시하기 위해서는, 색명과 16진의 값을 텍스트 표시해 두고 싶다.
거기서 고민하는 것이, 색명과 16진의 텍스트의 표시색이다. 하나하나 지정해도 좋지만, 어떻게든 자동으로 표시색을 지정할 수 없는가 하는 것으로, HSV값을 사용하는 것으로.

제 경우 표시 색 지정에는 16 진을 사용하고 있지만 텍스트 표시 색을 결정하기 위해 16 진의 스트립 색을 한 번 RGB로 변환하고, 추가로 HSV로 변환하고 그 값에 따라 텍스트 표시 색을 결정하도록 했다.

텍스트 표시색을 결정하는 함수(def penc())는 다음과 같다. colorsys.rgb_to_hsv 라는 편리한 것이 있기 때문에, RGB에서 HSV로의 변환에는 이것을 사용하고 있다.
def penc(hval):
    r=int(hval[1:3],16)
    g=int(hval[3:5],16)
    b=int(hval[6:8],16)
    hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
    h=hsv[0]
    s=hsv[1]
    v=hsv[2]
    col='#000000'
    if 0.5<h: col='#ffffff'
    if v<0.75: col='#ffffff'
    return col

위의 예에서는 텍스트 표시 색을 먼저 검정(#000000)으로 지정하지만 HSV의 H가 0.5를 초과하고 V의 값이 0.75 미만인 경우 텍스트 표시 색을 흰색(#ffffff) 하고 싶다.
반대색을 사용하는 등의 방법도 생각했지만, 텍스트 표시색을 화려하게 하는 것도 저항이 있었기 때문에, 표시색은 흑과 백만으로 나누도록(듯이) 한 것이다.

프로그램 전문


import matplotlib
import colorsys
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.family'] = 'Ricty Diminished'


def penc(hval):
    #https://docs.python.org/ja/3/library/colorsys.html
    r=int(hval[1:3],16)
    g=int(hval[3:5],16)
    b=int(hval[6:8],16)
    hsv=colorsys.rgb_to_hsv(r/255, g/255, b/255)
    h=hsv[0]
    s=hsv[1]
    v=hsv[2]
    col='#000000'
    if 0.5<h: col='#ffffff'
    if v<0.75: col='#ffffff'
    return col


cdic=matplotlib.colors.cnames
lkey=[]
lval=[]
for key, val in zip(cdic.keys(), cdic.values()):
    lkey=lkey+[key]
    lval=lval+[val]

xmin=0
xmax=4
k=-1
fnameF='fig_col_mpl.png'
ymin=0
ymax=37
plt.figure(figsize=(6,12))
plt.xlim([xmin,xmax])
plt.ylim([ymax,ymin])
plt.axis('off')
fsize=8 # fontsize
k=-1
for i in range(int(ymin),int(ymax)):
    for j in range(0,4):
        k=k+1
        if k<len(lval):
            xs=float(j)
            xe=xs+1.0
            ys=float(i)
            ye=ys+1.0
            xx=[xs,xe,xe,xs]
            yy=[ys,ys,ye,ye]
            plt.fill(xx,yy,color=lval[k])
            text1=lkey[k]
            text2=lval[k]
            xg=0.5*(xs+xe)
            yg=0.5*(ys+ye)
            col=penc(lval[k])
            plt.text(xg,yg-0.25,text1,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
            plt.text(xg,yg+0.25,text2,rotation=0,ha='center',va='center',fontsize=fsize,color=col)
plt.savefig(fnameF, dpi=300, bbox_inches="tight", pad_inches=0)

그 이상

좋은 웹페이지 즐겨찾기