2017-12-09 7 views
0

는 지금 내 코드는 다음과 같습니다하기 matplotlib의 히트 맵, 사용자 정의 y 축이

#generate 262*20 elements 
values = np.random.random(262*20).tolist() 
# convert the list to a 2D NumPy array 
values = np.array(values).reshape((262, 20)) 
h, w = values.shape 
#h=262, w=20 
fig = plt.figure(num=None, dpi=80,figsize=(9, 7), facecolor='w', edgecolor='k') 
ax = fig.add_subplot(111) 
#fig, ax = plt.subplots() 
plt.imshow(values) 
plt.colorbar() 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 
ax.set_aspect(w/h) 
plt.show() 

줄거리는 다음과 같습니다 : 당신이 볼 수 있듯이

enter image description here

가, Y 축 범위는 0-261.

하지만 y 축은 26에서 290로, 누락 된 57, 239 및 253이 필요합니다. 따라서 총 262 개입니다. 나는 다음과 같은리스트를 생성하려고 시도했다 :

mylist =[26, 27, ......missing 57, 239, 253, ....290] 
plt.yticks(np.arange(h), mylist) 

Y 축은 모든 것이 함께 스쳐 지나간 것처럼 보인다.

pylab.ylim([26, 290]) 

을 그리고 그것은 다음과 같습니다 :

그래서 나는 시도

enter image description here

그래서 그냥 첫 번째 행의 데이터 느낌

항상 [0],하지에에 해당하는 [ 26]

+0

틱 레이블을 수정해야한다고 생각합니다 ([여기] (https://matplotlib.org/api/_as_gen/ 참조). matplotlib.pyplot.xlabel.html? highlight = matplotlib % 20pyplot % 20xlabel # matplotlib.pyplot.xlabel)) 및 틱 자체가 아닙니다. 진드기는 실제 데이터에 해당하며 26-290 범위의 데이터를 생성하지 않으면 틱을 변경하면 원하는 결과가 제공되지 않습니다. –

답변

1

pcolormesh을 제안하십시오. 간격이 필요한 경우 간격이있는 영역에 numpy.ma.masked 배열을 사용하십시오.

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

values = np.random.rand(290,20) 
values[:26, :] = np.NaN 
values[ [57, 239, 253], :] = np.NaN 
values = np.ma.masked_invalid(values) 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 
x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 
plt.show() 

Result

편집

이 57, 239 및 253에 빈 줄을 넣어하지 않습니다

values = np.random.rand(262,20) 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 
y = np.delete(y, [57, 239, 253]) 
y = np.delete(y, range(26)) 

x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, values, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 

plt.show() 

하는 것으로 : 당신은 단지 262x20 배열 승/일을합니다. 원하는 경우 다음을 수행해야합니다.

values = np.random.rand(262,20) 
Z = np.ones((290, 20)) * np.NaN 
inds = set(range(290)) - set(list(range(26)) + [57, 239, 253]) 
for nn, ind in enumerate(inds): 
    Z[ind, :] = values[nn,:] 

h, w = values.shape 
fig, ax = plt.subplots(figsize=(9,7)) 
# Make one larger so these values represent the edge of the data pixels. 
y = np.arange(0, 290.5) 

x = np.arange(0, 20.5) 

pcm = ax.pcolormesh(x, y, Z, rasterized=True) # you don't need rasterized=True 
fig.colorbar(pcm) 
plt.xticks(np.arange(w), list('PNIYLKCVFWABCDEFGHIJ')) 

plt.show() 
+0

값 목록이 임의로 생성되지 않으면 파일 입력에 따라 달라집니다. values ​​= 파일에서 읽은 다음 numpy 배열로 다시 형성합니다. – JY078

+0

초기 배열을 구성하는 것은 다른 질문이며 파일 형식을 이해하고 사용하는 경우를 추측하기는 매우 어렵습니다. –

+0

위의 편집 참조. –