matplotlib에서 그래프의 색상을 연속적으로 변경하고 플롯하고 legend를 쉽게 많이 정렬하는 방법

matplotlib로 색상을 변경하고 legend를 많이 표시하고 싶습니다.



사용소



matplotlib 를 사용해, 그래프를 많이 표시하고 싶지만, 디폴트의 색의 설정이라면 유한개의 색 밖에 낼 수 없다. 이것을 쉽게 해결하는 방법을 소개하고 싶습니다. 그러한 경우, legend도 많이 표시하고 싶은 것이 많다고 생각하지만, 옛날의 matplotlib에서는 어려웠지만, 지금은 매우 간단하게 할 수 있으므로, 덤으로 그 방법도 소개한다.

샘플



개요



y = arctan((n+1)x) 와 y = x^n 의 2 개의 함수에 대해, n 을 20 개 어긋난 그래프를 겹쳐쓰는 예를 소개한다.

colormap 포인트


usercmap = plt.get_cmap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)

이제 colormap에서 jet을 선택하고 0에서 num (20) 개의 데이터 수로 색상을 선언하여 cm.ScalarMappable에서 scalarMap을 생성합니다. for loop 중,
c = scalarMap.to_rgba(i) 로 색상을 선택합니다.

legend을 많이 표시하는 포인트


plt.legend(bbox_to_anchor=(0., 1.01, 1., 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)

bbox_to_anchor=(X좌표, Y좌표, X사이즈, Y사이즈)로 두는 장소를 지정해, ncol로 접는 칼럼수를 조절한다.

샘플 코드



qiita_legend_sample.py

#!/usr/bin/env python 
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'serif'
import optparse
import matplotlib.pylab as plab
from matplotlib.colors import LogNorm
import matplotlib.colors as colors

### plot 1D plot : shifted 
F = plt.figure(figsize=(12,8.))
plt.subplots_adjust(wspace=0.3, hspace=0.6)

ax = plt.subplot(2,1,1)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)             
plt.figtext(0.02,0.02,"[matplotlib legend test]")
plt.xscale('linear')
plt.yscale('linear')
plt.grid(linestyle='dotted',alpha=0.5)
plt.xlabel(r'x-axis (a.u.)')
plt.ylabel(r'y-axis')        
x = np.arange(-1,1,0.1)
num=20
y = []
for j in range(num):
    y.append(np.arctan(x*(j+1)))

usercmap = plt.get_cmap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)

for i,oney in enumerate(y):
    c = scalarMap.to_rgba(i)
    plt.errorbar(x, oney, fmt="o-", color = c, alpha = 0.8, linewidth = 1, label=str(i))        

plt.legend(bbox_to_anchor=(0., 1.01, 1., 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)


ax = plt.subplot(2,1,2)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)             
plt.xscale('linear')
plt.yscale('linear')
plt.grid(linestyle='dotted',alpha=0.5)
plt.xlabel(r'x-axis (a.u.)')
plt.ylabel(r'y-axis')        
x = np.arange(-1,1,0.1)
num=20
y = []
for j in range(num):
    y.append(np.power(x,j+1))

usercmap = plt.get_cmap('jet')
cNorm  = colors.Normalize(vmin=0, vmax=num)
scalarMap = cm.ScalarMappable(norm=cNorm, cmap=usercmap)

for i,oney in enumerate(y):
    c = scalarMap.to_rgba(i)
    plt.errorbar(x, oney, fmt="o-", color = c, alpha = 0.8, linewidth = 1, label=str(i))        

plt.legend(bbox_to_anchor=(-0.1, 1.0, 1.2, 0.01), loc='lower left',ncol=10, mode="expand", borderaxespad=0.,fontsize=8)

plt.savefig("qiita_legend_sample.png")
plt.show()



생성되는 그림은 이쪽.



주의사항



이와 같이 legend 를 옆으로 펼쳐서 그래프 밖에 표시하는 것은 간단해졌지만, expand라는 옵션은 횡방향으로만 대응하고 있어 세로에는 대응하지 않는다(2019.1.8 현재). 시간이 해결해 줄 거라고 생각하지만.

좋은 웹페이지 즐겨찾기