programing

matplotlib에서 색상 막대 범위 설정

lastmoon 2023. 7. 16. 17:45
반응형

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)로 설정합니다.두 그래프 모두 위의 모든 범위의 cdict를 사용하여 이 색상 범위가 동일하기를 원합니다(따라서 두 그래프 모두 0.25는 동일한 색상이 됩니다).첫 번째 그래프에서 0.3에서 1.0 사이의 모든 색상은 그래프에 표시되지 않지만 측면의 색상 막대 키에 표시됩니다.반대로 0과 0.2 사이, 0.8과 1 사이의 모든 색상은 그래프에 표시되지 않고 측면의 색상 막대에 표시됩니다.

사용.vmin그리고.vmax색상 범위를 강제로 지정합니다.다음은 예입니다.

enter image description here

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의 CAX 기능과 동일).

plt.pcolor(X, Y, v, cmap=cm)
plt.clim(-4,4)  # identical to caxis([-4,4]) in MATLAB
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)

두 가지 다른 한계를 사용하여 색상 막대의 범위와 범례를 제어할 수 있습니다.이 예에서는 -0.5 ~ 1.5 범위만 막대에 표시되고 색상표는 -2 ~ 2를 포함합니다(따라서 스케일링 전에 기록하는 데이터 범위가 될 수 있습니다).

따라서 컬러 맵의 크기를 조정하는 대신 데이터의 크기를 조정하고 컬러 바를 조정합니다.

그림 환경 및 .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()

enter image description here

단일 색상 막대

그런 다음 전체 그림에 단일 색상 막대를 사용하는 것이 가장 좋습니다.다양한 방법이 있습니다. 이 튜토리얼은 최상의 옵션을 이해하는 데 매우 유용합니다.코드의 컬러바 부분을 이전에 시각화하는 대신 복사하여 붙여넣을 수 있는 솔루션을 선호합니다.

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)

enter image description here

추신.

는 를사하는것좋다습니이용을 사용하는 것을 추천합니다.pcolormeshpcolor더 빠르기 때문입니다(여기 더 많은 정보).

언급URL : https://stackoverflow.com/questions/3373256/set-colorbar-range-in-matplotlib

반응형