2017-12-03 1 views
-1

일부 데이터 파일에서 등고선 도표를 만들려고합니다. 내가 가지고있는 문제는 색상 막대의 최소값 아래의 z 값이 최소값과 같은 색상이되도록하려는 것입니다. 예를 들어 선형 눈금을 사용할 때 이것은 쉽습니다. contourf에 대해 extend="both" 옵션을 사용하거나 색상 표에 cmap.set_under()을 사용하십시오. 불행히도 이러한 옵션 중 어느 것도 로그 스케일을 사용할 때 작동하지 않습니다. 누구든지 해결 방법을 제안 할 수 있습니까? 난 그냥 아래의 그래프에서 흰색 영역을 제거하려면 : 로그 스케일로 작업하지 extend 키워드 matplotlibknown issue 것 같습니다Python : 로그 스케일 색상 막대가 필요한 contourf 플롯에서 0 값 색상 설정

enter image description here

#!/usr/bin/env python 
import numpy as np 
import matplotlib.pyplot as plt 
import scipy.interpolate 
from matplotlib import colors, ticker, cm 
from matplotlib.colors import LogNorm 
N = 100 #number of points for plotting/interpolation 

y, x, z = np.genfromtxt(r'40Ca_208Pb_39K_Ex_115deg.dat', unpack=True) 

xi = np.linspace(x.min(), x.max(), N) 
yi = np.linspace(y.min(), y.max(), N) 
zi = scipy.interpolate.griddata((x, y), z, (xi[None,:], yi[:,None]), method='linear') 

hfont = {'fontname':'Palatino'} 

fig = plt.figure(facecolor="white") 

zi = np.ma.masked_less(zi, 1e-7) 

plt.contourf(xi, yi, zi,levels=[1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1],cmap=plt.cm.jet,norm = LogNorm()) 

plt.xlabel("$E_{x}$") 
plt.ylabel("$E/V_{B}$") 
plt.colorbar() 
plt.show() 
+0

당신이 만약 'set_under'가 제대로 작동하지 않는다고 생각하면 문제의 [mcve]를 제공해야합니다. 여기에서는 배열을 마스크하여 플롯하므로 마스크 된 부분은 단순히 플롯되지 않습니다. 플롯되지 않은 것에 색을 설정할 수 없습니다. 반면에 축의 배경색을 원하는 색상으로 간단히 변경할 수 있습니다. – ImportanceOfBeingErnest

답변

0

.

원유 해결 방법은 그려 범위에있는 모든 값을 강요하는 것입니다합니다 (min_drawn_valuemax_drawn_value에 대한 의견을 통지, 값이이 범위 안에 있어야합니다) :

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

N = 100 # number of points for plotting/interpolation 
min_exp = -8 
max_exp = -2 

min_drawn_value = 1.000001 * 10.**min_exp # above 10.**min_exp 
max_drawn_value = 0.999999 * 10.**max_exp # below 10.**max_exp 

xi = np.linspace(0, 1, N) 
yi = np.linspace(0, 1, N) 
zi = np.random.rand(N, N) *\ 
    10. ** np.random.randint(min_exp - 1, max_exp + 2, (N, N)) 
zi = np.sort(zi.flatten()).reshape(N,N) 

# Coerce values outside of colorbar range to lie within 
zi_masked = np.where(zi < 10.**min_exp, min_drawn_value, zi) 
zi_masked = np.where(zi_masked > 10.**max_exp, max_drawn_value, zi_masked) 


fig, (ax,ax2) = plt.subplots(ncols=2) 

c1 = ax.contourf(xi, yi, zi, levels=10.**np.arange(min_exp, max_exp+1), 
      cmap=plt.cm.jet, norm=LogNorm()) 

c2 = ax2.contourf(xi, yi, zi_masked, levels=10.**np.arange(min_exp, max_exp+1), 
      cmap=plt.cm.jet, norm=LogNorm()) 

ax.set_title("direct plot of array") 
ax2.set_title("coerce outlier values") 
fig.colorbar(c1, ax=ax) 
fig.colorbar(c2, ax=ax2) 
fig.subplots_adjust(wspace=0.3) 
plt.show() 

enter image description here

+1

질문의 코드와 얼마나 다른가요? 또한 마스크 된 배열을 사용합니다. 따라서 바깥 쪽의 값은 플롯되지 않습니다. 아니면 코드를 오해 했습니까? – ImportanceOfBeingErnest

+0

'10. ** min_exp'보다 작고'10. ** max_exp'에서 값이 한계와 같으면 흰색으로 그려지기 때문입니다. 그것을 지적 했음에 틀림 없다. – berna1111

+1

나는 본다. 저는 자유를 수정하여 답을 수정했습니다. 나는 그것이 지금 훨씬 더 분명하다고 생각한다. 동의하지 않으면 이전 버전으로 롤백하십시오. – ImportanceOfBeingErnest