2011-04-21 1 views
8

대수 색 스케일링을 사용하여 contour-plot에 문제가 있습니다. 나는 수준을 손으로 지정하고 싶다. 그러나 Matplotlib은 이상한 방식으로 색상 막대를 그립니다. 레이블은 잘 배치되지 않고 단 하나의 색상 만 나타납니다. 아이디어는 을 기반으로합니다. http://adversus.110mb.com/?cat=8Python matplotlib 등고선도 로그 피겨 스케일

누가 저를 도울 수 있습니까? 나는 (2011-04-21)

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,levels=[1e0,1e-1,1e-2,1e-3],cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

는 당신의 도움을 주셔서 감사합니다 최신 자식-저장소하기 matplotlib 버전 v1.1.0 개발자를 사용! 왜하기 matplotlib 나를 로그 모드에서 레벨 라인의 수를 선택하는 것을 허용하지 않습니다 : 그것은 당신이 제안 ... 는 그러나, 나는 또 다른 질문이, 완벽하게 작동

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.mlab import bivariate_normal 
from matplotlib.colors import LogNorm 
from matplotlib.backends.backend_pdf import PdfPages 


delta = 0.5 

x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 

fig = plt.figure() 
ax = fig.add_subplot(1,1,1) 
#axim = ax.imshow(Z, norm = LogNorm()) 
#axim = ax.contourf(X,Y,Z,levels=[1e-3,1e-2,1e-1,1e0],cmap=plt.cm.jet,norm = LogNorm()) 
axim = ax.contourf(X,Y,Z,20,cmap=plt.cm.jet,norm = LogNorm()) 
cb = fig.colorbar(axim) 

pp = PdfPages('fig.pdf') 
pp.savefig() 
pp.close() 


plt.show() 

http://i.stack.imgur.com/VeVFQ.png

이 있었다 내 원래의 문제 ...

답변

9

이렇게 쉽게 고칠 수 있습니다. 당신의 레벨 순서는 최하위 레벨이 마지막에 그려 지므로 모든 것을 커버한다는 것을 의미합니다! 시도 :

axim = ax.contourf(X,Y,Z,levels=[1e-3, 1e-2, 1e-1, 1e0],cmap=plt.cm.jet,norm = LogNorm()) 

대신 원하는 결과를 얻으실 수 있습니다.

+0

감사합니다. - 두 번째 질문에 대답해도 될까요? – 7asd23hasd

+0

@ 45z23dsa : LogNorm 설정의 간격은 레벨에서 기본 10으로 설정됩니다. 데이터가 ~ 1e-8까지 ​​내려 가기 때문에 ~ 8 레벨로 끝납니다. 너는 너 자신 기초를 바꾸어서 이것을 주변에 얻을 수 있는다. 예 : lev2 = np.arange (np.floor (np.log2 (Z.min()) - 1), np.ceil (np.log2 (Z.max()) +1)'levs = np. power (2, lev_exp)'는'levels' 인수로 전달할 수있는 2 개의 기본 레벨을 제공합니다. 그러나 정확히 20 레벨을 얻으려면 비표준베이스를 사용해야합니다. – jmetz

+0

친애하는 mutmmatron, 이것에 대해 조사해 주셔서 감사합니다! 그래서 내가 원하는 수준의 목록을 제공하는 것이 더 쉽습니다 ... 그래서 나는 두 가지 질문을 모두 해결되는 것으로 간주합니다! – 7asd23hasd

2

그것은 levels 값이 증가 할 것으로 예상됩니다. 이 파일을 levels=[1e-3, 1e-2, 1e-1, 1e0]으로 변경하고 문제가 해결되는지 확인하십시오.

+0

감사합니다. 어쩌면 두 번째 질문에도 대답 할 수 있을까요? – 7asd23hasd