2013-08-12 1 views
11

아래 이미지와 같이 로그 막대의 레벨을 가질 수 있습니까?matplotlib 등고선도 : 대수 눈금의 비례 색상 막대 레벨

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.colors import LogNorm 
delta = 0.025 

x = y = np.arange(0, 3.01, delta) 
X, Y = np.meshgrid(x, y) 
Z1 = plt.mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = plt.mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
Z = 1e6 * (Z1* Z2) 

fig=plt.figure() 
ax1 = fig.add_subplot(111) 
lvls = np.logspace(0,4,20) 
CF = ax1.contourf(X,Y,Z, 
     norm = LogNorm(), 
     levels = lvls 
     ) 
CS = ax1.contour(X,Y,Z, 
     norm = LogNorm(), 
     colors = 'k', 
     levels = lvls 
     ) 
cbar = plt.colorbar(CF, ticks=lvls, format='%.4f') 
plt.show() 

enter image description here

내가

윈도우 7에하기 matplotlib 1.1.1 파이썬 2.7.3을 사용하고 있습니다 : 여기

enter image description here

는 구현 될 수있는 몇 가지 샘플 코드입니다
+0

귀하의 컬러 바는 이미 로그 스케일을가집니다. – hooy

+2

@nordev - 나는 OP가 정기적 인 로그 간격으로 라벨을 표시하기 위해 컬러 막대에 진드기 로케이터와 포맷터를 설정하는 방법을 묻고 있다고 생각합니다. –

+0

@JoeKington 아, 그의 [원래 질문] (http://stackoverflow.com/revisions/17951672/1)의 OP가 눈금을 배열'lvls'에 주어진 값에 놓기를 원했습니다. 대수적 인 간격이지만 어쩌면 나는 그가 의미하는 바를 오해했을 것입니다. 그것을 지적 주셔서 감사합니다. – hooy

답변

13

다음과 같이 pseudo colorbar를 생성 할 것을 제안합니다 (설명 참조) :

colorbar를 호출 할 때 spacing='proportional' 옵션을

pseudo-colorbar

편집

또는, 새로운 수준 같은 것을 사용하고 : :

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

delta = 0.025 

x = y = np.arange(0, 3.01, delta) 
X, Y = np.meshgrid(x, y) 
Z1 = plt.mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = plt.mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
Z = 1e6 * (Z1 * Z2) 

fig=plt.figure() 

# 
# define 2 subplots, using gridspec to control the 
# width ratios: 
# 
# note: you have to import matplotlib.gridspec for this 
# 
gs = gridspec.GridSpec(1, 2,width_ratios=[15,1]) 

# the 1st subplot 
ax1 = plt.subplot(gs[0]) 

lvls = np.logspace(0,4,20) 

CF = ax1.contourf(X,Y,Z, 
        norm = LogNorm(), 
        levels = lvls 
       ) 
CS = ax1.contour(X,Y,Z, 
       norm = LogNorm(), 
       colors = 'k', 
       levels = lvls 
       ) 

# 
# the pseudo-colorbar 
# 

# the 2nd subplot 
ax2 = plt.subplot(gs[1])   

# 
# new levels! 
# 
# np.logspace gives you logarithmically spaced levels - 
# this, however, is not what you want in your colorbar 
# 
# you want equally spaced labels for each exponential group: 
# 
levls = np.linspace(1,10,10) 
levls = np.concatenate((levls[:-1],np.linspace(10,100,10))) 
levls = np.concatenate((levls[:-1],np.linspace(100,1000,10))) 
levls = np.concatenate((levls[:-1],np.linspace(1000,10000,10))) 

# 
# simple x,y setup for a contourf plot to serve as colorbar 
# 
XC = [np.zeros(len(levls)), np.ones(len(levls))] 
YC = [levls, levls] 
CM = ax2.contourf(XC,YC,YC, levels=levls, norm = LogNorm()) 
# log y-scale 
ax2.set_yscale('log') 
# y-labels on the right 
ax2.yaxis.tick_right() 
# no x-ticks 
ax2.set_xticks([]) 

plt.show() 

이 당신에게이 같은 플롯을 줄 것이다

  1. 이와

    cbar = plt.colorbar(CF, ticks=lvls, format='%.4f') 
    

    :

    cbar = plt.colorbar(CF, ticks=lvls, format='%.2f', spacing='proportional') 
    

lvls = np.linspace(1,10,5) 
lvls = np.concatenate((lvls[:-1],np.linspace(10,100,5))) 
lvls = np.concatenate((lvls[:-1],np.linspace(100,1000,5))) 
lvls = np.concatenate((lvls[:-1],np.linspace(1000,10000,5))) 
  • 이 줄을 대체 :이와

    lvls = np.logspace(0,4,20) 
    

    이 선을 배치

    그리고이 음모에 종료됩니다 :

    real-colorbar

    (새로운 틱이 4 소수점을 필요로하지 않기 때문에 format 만, 변경되었습니다)

    편집 2
    당신이 만약 내가 사용한 코드를 자동으로 생성하고 싶다면 다음 코드를 고려해 볼 수 있습니다.

    levels = [] 
    LAST_EXP = 4 
    N_LEVELS = 5 
    for E in range(0,LAST_EXP): 
        levels = np.concatenate((levels[:-1],np.linspace(10**E,10**(E+1),N_LEVELS)))