IT

matplotlib에서 컬러 바 범위 설정

lottoking 2020. 7. 5. 07:46
반응형

matplotlib에서 컬러 바 범위 설정


다음 코드가 있습니다.

import matplotlib.pyplot as plt

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

plt.clf()
plt.pcolor(X, Y, v, cmap=cm)
plt.loglog()
plt.xlabel('X Axis')
plt.ylabel('Y Axis')

plt.colorbar()
plt.show()

따라서 지정된 컬러 맵을 사용하여 X 축과 Y 축에 값 'v'의 그래프가 생성됩니다. X 및 Y 축은 완벽하지만 컬러 맵이 최소값과 최대 값의 v 사이에 퍼집니다. 컬러 맵의 범위를 0과 1 사이로 설정하고 싶습니다.

나는 다음을 사용하려고 생각했다.

plt.axis(...)

축의 범위를 설정하려면 컬러 맵이 아닌 X 및 Y의 최소 및 최대 인수 만 사용합니다.

편집하다:

명확성을 위해 값 범위가 (0 ... 0.3) 인 그래프와 값이 (0.2 ... 0.8) 인 그래프가 있다고 가정하겠습니다.

두 그래프 모두에서 컬러 바의 범위를 (0 ... 1)로 설정하려고합니다. 두 그래프 모두 위의 전체 범위를 사용 하여이 색상 범위가 동일하기를 원합니다 (두 그래프의 0.25는 동일한 색상입니다). 첫 번째 그래프에서 0.3과 1.0 사이의 모든 색상은 그래프에 표시되지 않지만 측면의 색상 막대 키에는 표시됩니다. 다른 한편으로, 0과 0.2 사이, 0.8과 1 사이의 모든 색상은 그래프에 표시되지 않지만 측면의 색상 막대에 표시됩니다.


색상 범위를 사용 vmin하고 vmax강제로 적용합니다. 예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )

def do_plot(n, f, title):
    #plt.clf()
    plt.subplot(1, 3, n)
    plt.pcolor(X, Y, f(data), cmap=cm, vmin=-4, vmax=4)
    plt.title(title)
    plt.colorbar()

plt.figure()
do_plot(1, lambda x:x, "all")
do_plot(2, lambda x:np.clip(x, -4, 0), "<0")
do_plot(3, lambda x:np.clip(x, 0, 4), ">0")
plt.show()

CLIM 기능을 사용하십시오 ( MATLAB의 CAXIS 기능 과 동일 ).

plt.pcolor(X, Y, v, cmap=cm)
plt.clim(-4,4)
plt.show()


이것이 가장 우아한 솔루션인지 확실하지 않지만 (이것이 내가 사용한 것입니다) 데이터를 0에서 1 사이의 범위로 조정 한 다음 컬러 바를 수정할 수 있습니다.

import matplotlib as mpl
...
ax, _ = mpl.colorbar.make_axes(plt.gca(), shrink=0.5)
cbar = mpl.colorbar.ColorbarBase(ax, cmap=cm,
                       norm=mpl.colors.Normalize(vmin=-0.5, vmax=1.5))
cbar.set_clim(-2.0, 2.0)

With the two different limits you can control the range and legend of the colorbar. In this example only the range between -0.5 to 1.5 is show in the bar, while the colormap covers -2 to 2 (so this could be your data range, which you record before the scaling).

따라서 컬러 맵을 스케일링하는 대신 데이터를 스케일링하고 컬러 바를 그에 맞 춥니 다.


Using figure environment and .set_clim()

여러 플롯이있는 경우이 대안이 더 쉽고 안전 할 수 있습니다.

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

cdict = {
  'red'  :  ( (0.0, 0.25, .25), (0.02, .59, .59), (1., 1., 1.)),
  'green':  ( (0.0, 0.0, 0.0), (0.02, .45, .45), (1., .97, .97)),
  'blue' :  ( (0.0, 1.0, 1.0), (0.02, .75, .75), (1., 0.45, 0.45))
}

cm = m.colors.LinearSegmentedColormap('my_colormap', cdict, 1024)

x = np.arange(0, 10, .1)
y = np.arange(0, 10, .1)
X, Y = np.meshgrid(x,y)

data = 2*( np.sin(X) + np.sin(3*Y) )
data1 = np.clip(data,0,6)
data2 = np.clip(data,-6,0)
vmin = np.min(np.array([data,data1,data2]))
vmax = np.max(np.array([data,data1,data2]))

fig = plt.figure()
ax = fig.add_subplot(131)
mesh = ax.pcolormesh(data, cmap = cm)
mesh.set_clim(vmin,vmax)
ax1 = fig.add_subplot(132)
mesh1 = ax1.pcolormesh(data1, cmap = cm)
mesh1.set_clim(vmin,vmax)
ax2 = fig.add_subplot(133)
mesh2 = ax2.pcolormesh(data2, cmap = cm)
mesh2.set_clim(vmin,vmax)
# Visualizing colorbar part -start
fig.colorbar(mesh,ax=ax)
fig.colorbar(mesh1,ax=ax1)
fig.colorbar(mesh2,ax=ax2)
fig.tight_layout()
# Visualizing colorbar part -end

plt.show()

여기에 이미지 설명을 입력하십시오

단일 컬러 바

가장 좋은 대안은 전체 플롯에 단일 색상 막대를 사용하는 것입니다. 그렇게 여러 가지 방법이 있습니다 튜토리얼은 최선의 선택을 이해하는 데 매우 유용하다. 코드 의 이전 시각화 색상 막대 부분 대신 복사하여 붙여 넣을 수있는이 솔루션을 선호 합니다.

fig.subplots_adjust(bottom=0.1, top=0.9, left=0.1, right=0.8,
                    wspace=0.4, hspace=0.1)
cb_ax = fig.add_axes([0.83, 0.1, 0.02, 0.8])
cbar = fig.colorbar(mesh, cax=cb_ax)

여기에 이미지 설명을 입력하십시오

추신

나는 그것이 더 빠르기 때문에 pcolormesh대신에 사용 하는 것이 좋습니다 pcolor(더 많은 정보는 여기 ).

참고 URL : https://stackoverflow.com/questions/3373256/set-colorbar-range-in-matplotlib

반응형