2017-03-25 1 views
0

나는 python과 matplotlib를 사용하여 설문지에서 얻은 답을 히트 맵으로 만들려고합니다.직사각형 배열과 matshow가있는 빈 공간

매트릭스는 15x30이어야하지만 결과는 30x30 매트릭스입니다.

결과 : wrong result

내 코드 : 나는 X_POS을 제거하면

import matplotlib.pyplot as plt 
import numpy as np 
from matplotlib.colors import ListedColormap 

m = [[1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9], 
    [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9], 
    [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9]] 

person = [] 
p = 1 
for column in m: 
    person.append('person' + str(p)) 
    p += 1 
x_pos = np.arange(len(person)) 

question = [] 
i = 1 
for row in m: 
    question.append('question' + str(i)) 
    i += 1 
y_pos = np.arange(len(question)) 


Cmap =plt.get_cmap('RdYlGn' , np.max(m)-np.min(m)+1) 
mat = plt.matshow(m,cmap=Cmap,vmin = np.min(m)-.5, vmax = np.max(m)+.5) 
cax = plt.colorbar(mat, ticks=np.arange(np.min(m),np.max(m)+5)) 

plt.xticks(x_pos, question, rotation=90) 
plt.yticks(y_pos, person) 

plt.show() 

print(person) 
print(question) 

내가 바로 매트릭스를 얻을 수 있지만, 다음에 레이블이 없습니다. 내가 수동으로

Question = ['Question 1', 'Question 2',...] 

추천 라벨을 만들 경우 그럼 난 단지 아직 30x30matrix 15 개 레이블을 얻을 수 있지만.

내 코드에서이 문제의 원인은 무엇입니까? 어떻게 해결할 수 있습니까?

일반 코드 피드백도 문제가 실제로하고있는 것보다 뭔가 다른 일을하는 것이 좋습니다 루프의 두 가지에있다

답변

1

을 환영합니다.

for Ferrari in ["bike", "bus", "caravan"]:와 같은 루프에서 당신은 이것을 이렇게 부르더라도 페라리를 꺼내지 않을 것입니다.

그래서 두 루프에서 루프 변수를 다르게 호출하더라도 행렬의 행을 반복합니다.

문제를 해결하는 좋은 방법은 입력 목록을 수십 개의 배열로 만드는 것입니다. 그런 다음 모양을 반복하여 틱 레이블을 얻을 수 있습니다.

그래서 해결책은 이와 같이 보일 수 있습니다.

import matplotlib.pyplot as plt 
import numpy as np 

m = [[1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9], 
    [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9], 
    [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5], 
    [4,5,6,7,8,9,10,9,8,7,8,6,4,1,3], 
    [3,2,1,10,9,8,7,6,5,4,9,8,7,6,2], 
    [6,7,8,9,10,10,9,8,7,6,7,8,6,1,4], 
    [2,1,2,1,2,1,2,1,2,1,7,7,7,7,7], 
    [3,2,1,10,9,8,7,6,5,4,8,8,8,8,8], 
    [10,9,8,7,6,5,4,3,2,1,9,9,9,9,9], 
    [7,3,1,9,4,6,8,2,5,10,4,4,4,5,7], 
    [1,1,2,3,5,8,5,3,2,1,1,1,1,4,7], 
    [7,8,10,9,8,7,6,5,4,3,9,9,9,9,9]] 

#make m a numpy array 
m = np.array(m) 
#assume there are as many persons as rows in the array (=30) 
persons = list(map(lambda x: "person {}".format(x+1), range(m.shape[0]))) 
#assume there are as many questions as columns in the array (=15) 
questions = list(map(lambda x: "question {}".format(x+1), range(m.shape[1]))) 

fig, ax = plt.subplots() 
Cmap =plt.get_cmap('RdYlGn' , np.max(m)-np.min(m)+1) 
mat = ax.matshow(m,cmap=Cmap,vmin = np.min(m)-.5, vmax = np.max(m)+.5) 
cax = fig.colorbar(mat, ticks=np.arange(np.min(m),np.max(m)+5)) 

plt.xticks(range(len(questions)), questions, rotation=90) 
plt.yticks(range(len(persons)), persons) 

plt.tight_layout() 
plt.show() 

enter image description here

+0

당신의 설명은 매우 간결하고 명확하다, 감사합니다! –