2015-07-09 45 views
2

此问题与@ bgbg的question about how to visualize only the upper or lower triangle of a symmetric matrix in matplotlib有关。用他的代码(在末尾所示),我们可以生成这样的数字:imshow的上/下三角周围的边框

upper triangle of a symmetric matrix

现在我的问题:怎样才能画出一个暗边框仅此一套块的?我问,因为我想绘制两组相关数据,并将它们作为上下三角形相邻放置。然后,我们可以在每个三角形周围绘制一个黑色边框,分别代表两个三角形,并显示它们是不同的度量。所以,像这样的,但不能混淆:

upper and lower triangle of two different symmetric matrices

怎么办呢?

#Figure 1 
import numpy as NP 
from matplotlib import pyplot as PLT 
from matplotlib import cm as CM 

A = NP.random.randint(10, 100, 100).reshape(10, 10) 
mask = NP.tri(A.shape[0], k=-1) 
A = NP.ma.array(A, mask=mask) # mask out the lower triangle 
fig = PLT.figure() 
ax1 = fig.add_subplot(111) 
cmap = CM.get_cmap('jet', 10) # jet doesn't have white color 
cmap.set_bad('w') # default value is 'k' 
ax1.imshow(A, interpolation="nearest", cmap=cmap) 
ax1.grid(True) 
axis('off') 

#Figure 2 
A = NP.random.randint(10, 100, 100).reshape(10, 10) 
mask = NP.tri(A.shape[0], k=-1) 
mask = NP.zeros_like(A) 
mask[NP.arange(10), NP.arange(10)] = 1 
A = NP.ma.array(A, mask=mask) # mask out the lower triangle 
fig = PLT.figure() 
ax1 = fig.add_subplot(111) 
cmap = CM.get_cmap('jet', 10) # jet doesn't have white color 
cmap.set_bad('w') # default value is 'k' 
ax1.imshow(A, interpolation="nearest", cmap=cmap) 
title("Correlation Data 1") 
ylabel("Correlation Data 2") 
yticks([]) 
xticks([]) 

回答

2

你可以使用patches.Polygon绘制一个边框:

import numpy as NP 
from matplotlib import pyplot as PLT 
import matplotlib.patches as patches 

N = 10 
A = NP.random.randint(10, 100, N * N).reshape(N, N) 
mask = NP.tri(A.shape[0], k=-1) 
mask = NP.zeros_like(A) 
mask[NP.arange(N), NP.arange(N)] = 1 
A = NP.ma.array(A, mask=mask) # mask out the lower triangle 
fig, ax = PLT.subplots() 

cmap = PLT.get_cmap('jet', 10) # jet doesn't have white color 
cmap.set_bad('w') # default value is 'k' 
ax.imshow(A, interpolation="nearest", cmap=cmap, extent=[0, N, 0, N]) 

line = ([(0, N - 1), (0, 0), (N - 1, 0)] + 
     [(N - 1 - i - j, i + 1) for i in range(N - 1) for j in (0, 1)]) 
lines = [line, [(N - x, N - y) for x, y in line]] 
for line in lines: 
    path = patches.Polygon(line, facecolor='none', edgecolor='black', 
          linewidth=5, closed=True, joinstyle='round') 
    ax.add_patch(path) 
ax.set_xlabel("Correlation Data 1") 
ax.xaxis.set_label_position('top') 
ax.set_ylabel("Correlation Data 2") 
ax.set_yticks([]) 
ax.set_xticks([]) 
margin = 0.09 
ax.set_xlim(-margin, N + margin) 
ax.set_ylim(-margin, N + margin) 
ax.set_frame_on(False) 
PLT.show() 

enter image description here

+0

谢谢!有没有办法让相同的边框环绕三角形的其余部分? – jeffalstott