matplotlib에서 컬러 바 범위 설정


156

다음 코드가 있습니다.

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 사이의 모든 색상은 그래프에 표시되지 않지만 측면의 색상 막대에 표시됩니다.

답변:


177

색상 범위를 사용 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()

3
@Amro가 게시 한 plt.clim을 사용하는 것보다이 답변이 더 나은 이유는 무엇입니까?
Alex Lamson

90

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

plt.pcolor(X, Y, v, cmap=cm)
plt.clim(-4,4)  # identical to caxis([-4,4]) in MATLAB
plt.show()

2
clim ()은 색상 축의 크기를 조정하지만 색상 자체는 값을 변경한다고 생각합니다. 스케일을 따라 특정 분수의 점은 스케일에 관계없이 동일한 색상이지만 해당 값이 변경됩니다.
Paul

4
예. 이것은 asker의 바람직한 동작이므로 문제를 해결합니다. 그래프간에 색상 스케일이 동일해야합니다.
Excalabur

16

이것이 가장 우아한 솔루션인지 확실하지 않지만 (이것이 내가 사용한 것입니다) 데이터를 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까지 (따라서 스케일링 전에 기록하는 데이터 범위 일 수 있음)입니다.

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


1
나는 그것이 미묘하게 다른 것을하고 있다고 생각합니다 ... 미안하지만 아마도 내 질문에 충분히 정확하지 않았을 것입니다. 솔루션은 색상을 조정하여 값 1.0을 나타내는 데 사용한 것이 이제 내 데이터의 최대 값을 나타냅니다. 컬러 바는 필요에 따라 0..1을 표시하지만 (vmin = 0, vmax = 1)이 최대 값을 초과하는 모든 것은 같은 색이됩니다.
Paul

1
... 내가 겪고있는 것을 더 명확하게 보여주기 위해 질문을 업데이트했습니다. 내가 너무 모호한 경우 죄송합니다.
Paul

10

그림 환경 및 .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(더 많은 정보는 여기 ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.