2017-12-07 2 views
2

의 내가 같은 데이터가 있다고 가정 해 봅시다 :사용자 정의 된 색상 맵을 작성하여 다양한 데이터 범위에 사용하는 방법은 무엇입니까?

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.colors 

# for reproducibility purposes 
np.random.seed(0) 

# generate some data 
n = 30 
x = np.array(range(n)) 

a1 = np.random.rand(n) 
a2 = a1 * 100 

그리고 내가

enter image description here을 제공합니다 (this answer의 변화)

cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", [(0., '#9696ff'), (0.2, '#f0ffff'), (1.0, '#ff0000')]) 

fig, (ax1, ax2) = plt.subplots(1, 2) 
ax1.scatter(x, a1, c=a1, cmap=cmap) 
ax2.scatter(x, a2, c=a2, cmap=cmap) 
plt.show() 

을 할 수있는 두 개의 줄거리에서이 데이터를 플롯 할

문제는 내가 가지고있는 문제는이 데이터가 동일하다는 것입니다. 오른쪽은 100 배 더 큽니다.

그래서, 두 플롯에 모두 사용할 수있는 컬러 맵을 갖고 싶습니다. 위와 같은 명령을 사용하여 (대신

matplotlib.colors.LinearSegmentedColormap.from_list("", [(0., '#9696ff'), (0.2, '#f0ffff'), (1.0, '#ff0000')]) 

의 나는

min_a1_a2 = min(min(a1), min(a2)) 
max_a1_a2 = max(max(a1), max(a2)) 
cmap = matplotlib.colors.LinearSegmentedColormap.from_list("", [(min_a1_a2, '#9696ff'), ((min_a1_a2 + max_a1_a2)/2., '#f0ffff'), (max_a1_a2, '#ff0000')]) 

같은 것을 사용하고 싶습니다 그러나 이것은 항상 내가 scatter에 전달 오류

ValueError: data mapping points must start with x=0. and end with x=1

결과).

임의의 (값, 색상) 튜플에서 matplotlib.colors.LinearSegmentedColormap.from_list까지 전달한 다음 생성 된 색상 맵을 예 : scatter 만약 그렇다면 어떻게하나요?

답변

2

matplotlib 색상 표는 0과 1 사이의 숫자 범위를 색상 범위에 매핑합니다.

데이터가 [0,1] 이외의 간격 (거의 항상 물론) 인 경우, 먼저 해당 간격으로 정규화됩니다. 이 정규화는 사용중인 ScalarMappable에 의해 내부적으로 수행됩니다 (예 :이 경우 스 캐터 플롯).

두 개의 다른 플롯에서 색상 코드를 공유해야하는 경우와 같이 맞춤 정규화가 필요한 경우 ScalarMappable을 만들 때 지정할 수 있습니다. vmin

plt.scatter(x,y, c=c, cmap=cmap, vmin=0, vmax=100) 

또는 정규화 인스턴스 그래서

plt.scatter(x,y, c=c, cmap=cmap, norm=plt.Normalize(0,100)) 
+0

통해 vmax를 사용

어느 단지 'ax1.scatter (X, A1, C = A1, cmap를 = cmap를, VMIN = min_a1_a2 , vmax = max_a1_a2)'(a2에 대한 아날로그)? 플롯은 이제 괜찮아 보입니다 ... 간단했습니다, 고마워요! – Cleb

관련 문제