기본 색상 변경 #
[링크 삽입]에서 자세히 설명한 것처럼 jet
경험적으로 잘못된 컬러맵이며 기본 컬러맵이 되어서는 안 됩니다. 플롯의 모양을 변경하면 이전 버전과의 호환성이 깨진다는 입장으로 인해 이 변경은 예상보다 훨씬 더 오래 연기되었습니다. imshow
기본 색상 맵을 변경하는 것 외에도 플롯의 기본 색상 주기를 변경하고 채워진 플롯( ,
pcolor
, contourf
등) 및 분산형 플롯에 대해 다른 색상 맵을 채택할 기회를 잡을 계획 입니다.
기본 히트맵 컬러맵 #
새로운 컬러맵의 선택은 바이크 쉐딩("아니요, _이_ 색상이어야 합니다")에 대한 비옥한 기반이므로 제안된 컬러맵을 평가하기 위한 제안된 세트 기준(Nathaniel Smith를 통해)이 있습니다.
순차적 컬러맵이어야 합니다. 데이터의 "중심"이 어디인지 알지 못하는 한 분기 컬러맵은 실제로 오해의 소지가 있고 기본 컬러맵의 경우 일반적으로 그렇지 않기 때문입니다.
그것은 지각적으로 균일해야 합니다. 즉, 주변 색상이 얼마나 멀리 떨어져 있는지에 대한 인간의 주관적인 판단은 적어도 국지적으로는 색상이 나타내는 수치 간의 차이에 가능한 한 선형적으로 일치해야 합니다.
지각적으로 균일한 휘도 램프를 가져야 합니다. 즉, 그레이스케일로 변환하더라도 여전히 균일해야 합니다. 이는 실용적인 측면(그레이스케일 프린터는 여전히 중요합니다!)과 휘도가 크기에 대한 매우 강력하고 자연스러운 단서이기 때문에 유용합니다.
또한 색조에 어떤 종류의 변화가 있어야 합니다. 왜냐하면 색조 변화는 인식에 정말 도움이 되는 추가 신호이기 때문입니다.
보다 일반적인 유형의 색맹을 가진 시청자에게도 합리적인 결과를 생성할 수 있도록 색조 변화를 선택해야 합니다. (적색-녹색과 같은 것을 배제합니다.)
보너스 포인트의 경우, 휘도 변화를 버려도 여전히 작동하는 색조 램프를 선택하는 것이 좋을 것입니다. 그러면 2d 플롯에 휘도가 변화하는 버전을 사용할 수 있고 3d 플롯에 색조 변화만 있는 버전을 사용할 수 있기 때문입니다. (3d 플롯에서는 조명/음영을 위한 휘도 채널을 예약하고 싶습니다. 뇌가 휘도 변화에서 3d 모양을 추출하는 데 정말 능숙하기 때문입니다. 3d 표면 자체의 휘도가 크게 변하면 모양을 보는 능력이 망가집니다. )
기존 IP를 침해하지 않음
예제 스크립트 #
제안된 컬러맵 #
기본 산란 컬러맵 #
히트 맵과 같은 응용 프로그램의 경우 가능한 한 많은 휘도 스케일을 포함하는 것이 바람직할 수 있지만 마커를 컬러 매핑할 때 마커가 흰색에 너무 가까워지면 문제가 될 수 있습니다. 이러한 이유로 우리는 마커 기반의 히트 맵에 대해 다른(하지만 아마도 관련이 있는) 컬러맵을 사용할 것을 제안합니다. 설계 매개변수는 위와 동일하지만 휘도 변화가 더 제한적입니다.
예제 스크립트 #
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1234)
fig, (ax1, ax2) = plt.subplots(1, 2)
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = np.pi * (15 * np.random.rand(N))**2 # 0 to 15 point radiuses
ax1.scatter(x, y, s=area, c=colors, alpha=0.5)
X,Y = np.meshgrid(np.arange(0, 2*np.pi, .2),
np.arange(0, 2*np.pi, .2))
U = np.cos(X)
V = np.sin(Y)
Q = ax2.quiver(X, Y, U, V, units='width')
qd = np.random.rand(np.prod(X.shape))
Q.set_array(qd)
제안된 컬러맵 #
컬러 사이클 / 질적 컬러맵 #
라인을 플로팅할 때 구분 가능해야 하는 여러 라인이나 아티스트를 플로팅하는 것이 바람직하지만 고유한 순서는 없습니다.
예제 스크립트 #
import numpy as np
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2)
x = np.linspace(0, 1, 10)
for j in range(10):
ax1.plot(x, x * j)
th = np.linspace(0, 2*np.pi, 1024)
for j in np.linspace(0, np.pi, 10):
ax2.plot(th, np.sin(th + j))
ax2.set_xlim(0, 2*np.pi)