다음과 같이 pseudo colorbar를 생성 할 것을 제안합니다 (설명 참조) :
colorbar
를 호출 할 때
spacing='proportional'
옵션을
![pseudo-colorbar](https://i.stack.imgur.com/wNHIw.png)
편집
또는, 새로운 수준 같은 것을 사용하고 : :
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()
이 당신에게이 같은 플롯을 줄 것이다
이와
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](https://i.stack.imgur.com/rapE4.png)
(새로운 틱이 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)))
귀하의 컬러 바는 이미 로그 스케일을가집니다. – hooy
@nordev - 나는 OP가 정기적 인 로그 간격으로 라벨을 표시하기 위해 컬러 막대에 진드기 로케이터와 포맷터를 설정하는 방법을 묻고 있다고 생각합니다. –
@JoeKington 아, 그의 [원래 질문] (http://stackoverflow.com/revisions/17951672/1)의 OP가 눈금을 배열'lvls'에 주어진 값에 놓기를 원했습니다. 대수적 인 간격이지만 어쩌면 나는 그가 의미하는 바를 오해했을 것입니다. 그것을 지적 주셔서 감사합니다. – hooy