2017-09-30 7 views
1

matplotlib로 시각화하려고하는 상관 행렬 모자가 있습니다. 히트 맵 스타일의 그림을 만들 수는 있지만 레이블을 원하는 방식으로 문제가 있습니다. 이것이 가능하다면 나는 확신 할 수 없다. 그러나 이것은 내가하려고하는 것이고 작동하도록 만들 수 없다. :matplotlib 상관 행렬 히트 맵을 그룹화 된 색상으로 레이블

내 상관 행렬은 150 x 150이다. x 또는 y 또는 두 가지 모두 ... 이건 중요하지 않습니다) 축을 사용하여 레이블을 그룹화 한 다음 색상 배경에 흰색 레이블 또는 레이블로 레이블을 지정하고 싶습니다.

분명히 1-15를 "그룹 1"로하고 파란색 막대에 파란색 막대 또는 "그룹 1"텍스트를 넣고 싶다고합시다. 그런 다음 16-20을 빨간색 막대 또는 "빨간색 막대"의 "그룹 2"로 선택하십시오. Etc, 행렬의 모든 항목을 통해.

축 레이블을 그룹화 할 때뿐만 아니라 축 레이블을 모두 사용하지 못하고 있습니다. 어떤 도움이라도 대단히 감사하겠습니다. 내 코드는 기본 코드이지만 도움이 될지 모르겠다.

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

# COREELATION MATRIX TEST # 
corr = np.genfromtxt(csv_path,delimiter=',') 
fig = plt.figure() 
ax1 = fig.add_subplot(111) 
cmap = cm.get_cmap('jet', 30) 
cax = ax1.imshow(corr, cmap=cmap) 
ax1.grid(True) 
plt.title('THIS IS MY TITLE') 
fig.colorbar(cax, ticks=[-1,-0.8,-0.6,-0.4,-0.2,0.0,0.2,0.4,0.6,0.8,1.0]) 
plt.show() 
+0

어떻게 입력 데이터는 모양 않고 그룹화 매개 변수는 무엇인가? [mcve]에 몇 가지 샘플 데이터를 제공하고 줄거리 모양을 설명하는 데 사용하십시오. 아마도 당신이 원했던 것의 간단한 그림은 또한 원하는 음모를 이해하는 데 도움이 될 수 있습니다. – ImportanceOfBeingErnest

+0

유사한 데이터와 내가하고 싶은 사진이 온라인에서 발견되었습니다. [link] https://www.researchgate.net/profile/Deanna_Greene/publication/292707637/figure/fig5/AS:[email protected]/ 이 예에서는 빨간색 줄과 레이블 (예 : "기본 모드"및 "시각적")이 있습니다 (그림 1- 그룹 평균 -264-ROI264-ROI- 상관 행렬 - show-expected-network.png)). 내 변수를 같은 방법으로 그룹화하고 싶지만, 행렬의 빨간색 선 대신에 레이블 대신 색상 견본을 사용하고 싶습니다. 측면의 색상 막대와 비슷하지만 수동으로 설정된 색상이 있습니다. – iamdamion

답변

1

플롯 옆에 보조 축을 만들고 그 위에 컬러 막대 그림을 그릴 수 있습니다. 축 꼬추를 끄면 막대가 레이블 상자처럼 보입니다.

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

# COREELATION MATRIX TEST # 
corr = 2*np.random.rand(150,150)-1 
# labels [start,end] 
labels = np.array([[0,15],[16,36],[37,82],[83,111],[112,149]]) 
colors = ["crimson", "limegreen","gold","orchid","turquoise"] 

fig, ax = plt.subplots() 

im = ax.imshow(corr, cmap="Blues") 

ax.set_title('THIS IS MY TITLE') 
fig.colorbar(im, ticks=[-1,-0.8,-0.6,-0.4,-0.2,0.0,0.2,0.4,0.6,0.8,1.0]) 

# create axes next to plot 
divider = make_axes_locatable(ax) 
axb = divider.append_axes("bottom", "10%", pad=0.06, sharex=ax) 
axl = divider.append_axes("left", "10%", pad=0.06, sharey=ax) 
axb.invert_yaxis() 
axl.invert_xaxis() 
axb.axis("off") 
axl.axis("off") 


# plot colored bar plots to the axes 
barkw = dict(color=colors, linewidth=0.72, ec="k", clip_on=False, align='edge',) 
axb.bar(labels[:,0],np.ones(len(labels)), 
     width=np.diff(labels, axis=1).flatten(), **barkw) 
axl.barh(labels[:,0],np.ones(len(labels)), 
     height=np.diff(labels, axis=1).flatten(), **barkw) 

# set margins to zero again 
ax.margins(0) 
ax.tick_params(axis="both", bottom=0, left=0, labelbottom=0,labelleft=0) 
# Label the boxes 
textkw = dict(ha="center", va="center", fontsize="small") 
for k,l in labels: 
    axb.text((k+l)/2.,0.5, "{}-{}".format(k,l), **textkw) 
    axl.text(0.5,(k+l)/2., "{}-{}".format(k,l), rotation=-90,**textkw) 

plt.show()