컬러 맵을 사용하여 matplotlib에서 선 색상 설정
컬러 맵을 사용하여 런타임에 제공되는 스칼라 값으로 matplotlib에서 라인의 색상을 어떻게 설정 jet
합니까 (예 :) ? 나는 여기에서 몇 가지 다른 접근 방식을 시도했지만 난처한 것 같습니다. values[]
왜곡 된 스칼라 배열입니다. 곡선은 1 차원 배열의 집합이고 레이블은 텍스트 문자열의 배열입니다. 각 배열의 길이는 같습니다.
fig = plt.figure()
ax = fig.add_subplot(111)
jet = colors.Colormap('jet')
cNorm = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
lines = []
for idx in range(len(curves)):
line = curves[idx]
colorVal = scalarMap.to_rgba(values[idx])
retLine, = ax.plot(line, color=colorVal)
#retLine.set_color()
lines.append(retLine)
ax.legend(lines, labels, loc='upper right')
ax.grid()
plt.show()
수신하는 오류는을 정의하는 방법 때문 jet
입니다. Colormap
'jet'이라는 이름으로 기본 클래스 를 만들고 있지만 이는 'jet'컬러 맵의 기본 정의를 얻는 것과는 매우 다릅니다. 이 기본 클래스는 직접 만들어서는 안되며 하위 클래스 만 인스턴스화되어야합니다.
예제에서 찾은 것은 Matplotlib의 버그가있는 동작입니다. 이 코드를 실행하면 더 명확한 오류 메시지가 생성되어야합니다.
다음은 예제의 업데이트 된 버전입니다.
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cmx
import numpy as np
# define some random data that emulates your indeded code:
NCURVES = 10
np.random.seed(101)
curves = [np.random.random(20) for i in range(NCURVES)]
values = range(NCURVES)
fig = plt.figure()
ax = fig.add_subplot(111)
# replace the next line
#jet = colors.Colormap('jet')
# with
jet = cm = plt.get_cmap('jet')
cNorm = colors.Normalize(vmin=0, vmax=values[-1])
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=jet)
print scalarMap.get_clim()
lines = []
for idx in range(len(curves)):
line = curves[idx]
colorVal = scalarMap.to_rgba(values[idx])
colorText = (
'color: (%4.2f,%4.2f,%4.2f)'%(colorVal[0],colorVal[1],colorVal[2])
)
retLine, = ax.plot(line,
color=colorVal,
label=colorText)
lines.append(retLine)
#added this to get the legend to work
handles,labels = ax.get_legend_handles_labels()
ax.legend(handles, labels, loc='upper right')
ax.grid()
plt.show()
를 야기하는:
a를 사용하는 ScalarMappable
것은 내 관련 답변에 제시된 접근 방식보다 개선 된 것입니다 : matplotlib를 사용하여 20 개 이상의 고유 한 범례 색상 만들기
numpy의 linspace를 matplotlib의 cm 유형 객체와 결합하여 사용하는 더 간단한 방법이라고 생각하는 것을 포함하는 것이 유익 할 것이라고 생각했습니다. 위의 솔루션이 이전 버전 용일 수 있습니다. python 3.4.3, matplotlib 1.4.3 및 numpy 1.9.3을 사용하고 있으며 내 솔루션은 다음과 같습니다.
import matplotlib.pyplot as plt
from matplotlib import cm
from numpy import linspace
start = 0.0
stop = 1.0
number_of_lines= 1000
cm_subsection = linspace(start, stop, number_of_lines)
colors = [ cm.jet(x) for x in cm_subsection ]
for i, color in enumerate(colors):
plt.axhline(i, color=color)
plt.ylabel('Line Number')
plt.show()
그 결과 아래 그림과 같이 전체 cm.jet 컬러 맵에 걸쳐 1000 개의 고유 한 색상의 선이 생성됩니다. 이 스크립트를 실행하면 개별 라인을 확대 할 수 있습니다.
이제 1000 라인 색상이 400에서 600 라인 사이의 녹색 부분에 걸쳐 있기를 원한다고 가정합니다. 시작 및 중지 값을 0.4와 0.6으로 변경하면 0.4와 0.4 사이의 cm.jet 색상 맵의 20 % 만 사용됩니다. 0.6.
따라서 한 줄 요약에서 matplotlib.cm 컬러 맵에서 rgba 색상 목록을 적절하게 만들 수 있습니다.
colors = [ cm.jet(x) for x in linspace(start, stop, number_of_lines) ]
이 경우 일반적으로 호출되는 jet이라는 맵을 사용하지만 다음을 호출하여 matplotlib 버전에서 사용할 수있는 전체 컬러 맵 목록을 찾을 수 있습니다.
>>> from matplotlib import cm
>>> dir(cm)
의 선 스타일, 마커 및 품질 색상 조합 matplotlib
:
import itertools
import matplotlib as mpl
import matplotlib.pyplot as plt
N = 8*4+10
l_styles = ['-','--','-.',':']
m_styles = ['','.','o','^','*']
colormap = mpl.cm.Dark2.colors # Qualitative colormap
for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, colormap)):
plt.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=4);
업데이트 : ListedColormap
뿐만 아니라 지원LinearSegmentedColormap
import itertools
import matplotlib.pyplot as plt
Ncolors = 8
#colormap = plt.cm.Dark2# ListedColormap
colormap = plt.cm.viridis# LinearSegmentedColormap
Ncolors = min(colormap.N,Ncolors)
mapcolors = [colormap(int(x*colormap.N/Ncolors)) for x in range(Ncolors)]
N = Ncolors*4+10
l_styles = ['-','--','-.',':']
m_styles = ['','.','o','^','*']
fig,ax = plt.subplots(gridspec_kw=dict(right=0.6))
for i,(marker,linestyle,color) in zip(range(N),itertools.product(m_styles,l_styles, mapcolors)):
ax.plot([0,1,2],[0,2*i,2*i], color=color, linestyle=linestyle,marker=marker,label=i)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.,ncol=3,prop={'size': 8})
U는 삭제 된 계정에서 작성한대로 할 수 있습니다 (새 게시물 금지 :( 있음). 다소 간단하고보기 좋습니다.
나는 일반적 으로이 3 가지 중 3 번째를 사용하고 있으며 1 및 2 버전을 확인했습니다.
from matplotlib.pyplot import cm
import numpy as np
#variable n should be number of curves to plot (I skipped this earlier thinking that it is obvious when looking at picture - sorry my bad mistake xD): n=len(array_of_curves_to_plot)
#version 1:
color=cm.rainbow(np.linspace(0,1,n))
for i,c in zip(range(n),color):
ax1.plot(x, y,c=c)
#or version 2: - faster and better:
color=iter(cm.rainbow(np.linspace(0,1,n)))
c=next(color)
plt.plot(x,y,c=c)
#or version 3:
color=iter(cm.rainbow(np.linspace(0,1,n)))
for i in range(n):
c=next(color)
ax1.plot(x, y,c=c)
3의 예 :
Roll 진폭 A44의 함수에서 Roll 대 Ikeda 감쇠의 선박 RAO
참고 URL : https://stackoverflow.com/questions/8931268/using-colormaps-to-set-color-of-line-in-matplotlib
'Program Tip' 카테고리의 다른 글
log4net : 특정 클래스의 메시지를 무시하도록 구성 (0) | 2020.11.23 |
---|---|
iOS 보이스 오버 상태 (0) | 2020.11.23 |
Gunicorn에서 실행되는 Flask 앱 디버깅 (0) | 2020.11.23 |
지수 백오 프로 셀러리 작업 재시도 (0) | 2020.11.23 |
MVC3 편집기 읽기 전용 (0) | 2020.11.23 |