matplotlib imshow () 그래프 축의 값 변경


89

입력 데이터가 있다고 가정합니다.

data = np.random.normal(loc=100,scale=10,size=(500,1,32))
hist = np.ones((32,20)) # initialise hist
for z in range(32):
    hist[z],edges = np.histogram(data[:,0,z],bins=np.arange(80,122,2))

다음을 사용하여 플롯 할 수 있습니다 imshow().

plt.imshow(hist,cmap='Reds')

점점 :

여기에 이미지 설명 입력

그러나 x 축 값이 입력 데이터와 일치하지 않습니다 (즉, 평균 100, 범위 80에서 122). 따라서 x 축을 변경하여 edges.

나는 시도했다 :

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

여기에 이미지 설명 입력

사용중인 입력 데이터를 반영하도록 축 값을 변경하는 방법에 대한 아이디어가 있습니까?


답변 에서 언급 한 pcolor대신 사용하십시오 . imshow
Nirmal

답변:


142

xticklabels가능한 경우 변경하지 않으려 고 노력할 것입니다 . 그렇지 않으면 히스토그램을 추가 데이터로 과도하게 표시하는 경우 매우 혼란 스러울 수 있습니다.

그리드 범위를 정의하는 것이 아마도 가장 좋으며 키워드 imshow를 추가하여 수행 할 수 있습니다 extent. 이렇게하면 축이 자동으로 조정됩니다. 레이블을 변경하려면 set_xticks아마도 일부 포맷터와 함께 사용할 것입니다. 라벨을 직접 변경하는 것이 최후의 수단이어야합니다.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

여기에 이미지 설명 입력


18
interpolation="none"실제 데이터를 훨씬 더 정확하게 표현하기 위해 여기에 사용 된 것도 주목할 가치가 있습니다.
Hooked

4
가장 유용한 답변입니다. 두 변수 (즉, 지진 데이터)의 함수에 대한 색상 플롯을 만드는 데 사용했습니다. 또한 imshow ()에 "aspect = 'auto'"옵션을 추가하여 지진 디스플레이를 '늘리고 짜낼'수 있습니다.
Kurt Peek 2014 년

10

비슷한 문제가 있었고 Google이 나를이 게시물로 보냈습니다. 내 솔루션은 약간 다르고 덜 간결했지만 누군가에게 유용 할 수 있기를 바랍니다.

matplotlib.pyplot.imshow로 이미지를 표시하는 것은 일반적으로 2D 데이터를 표시하는 빠른 방법입니다. 그러나 이것은 기본적으로 픽셀 수로 축에 레이블을 지정합니다. 플로팅하는 2D 데이터가 배열 x 및 y로 정의 된 일부 균일 한 그리드에 해당하는 경우 matplotlib.pyplot.xticks 및 matplotlib.pyplot.yticks를 사용하여 해당 배열의 값을 사용하여 x 및 y 축에 레이블을 지정할 수 있습니다. 이는 실제 그리드 데이터에 해당하는 일부 레이블을 축의 픽셀 수에 연결합니다. 그리고 이것은 예를 들어 pcolor와 같은 것을 사용하는 것보다 훨씬 빠릅니다.

다음은 데이터를 사용한 시도입니다.

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.