Reputation:
I want to highlight specific element in heat map(on both row and column of heatmap) Is their a way to do highlight particular element on both axis .
The desire result should look like where the vector element got highlighted on both axis. Or similar to the example given below.
I am using seaborn and matplotlib.
EDIT 1: i am using dendogram and here is my code ,Where **PairWise ** denotes my data matrix.
import seaborn as sns
%matplotlib inline
pairwise_corr=PairWise.corr(method="spearman")
sns.clustermap(pairwise_corr,method="complete",annot=True,linewidth=0.5)
Edit 2: Here is the data with columns as a b c d e vector
array([[191, 395, 63, 89, 247, 201],
[379, 121, 187, 430, 265, 478],
[ 38, 220, 406, 450, 349, 354],
[165, 172, 469, 355, 56, 425],
[482, 143, 411, 322, 184, 492],
[ 16, 157, 172, 253, 320, 391],
[328, 443, 418, 392, 95, 93],
[208, 50, 362, 407, 43, 139],
[ 68, 257, 447, 472, 357, 11],
[164, 123, 469, 93, 296, 5],
[ 54, 419, 264, 370, 474, 387],
[171, 137, 108, 174, 339, 481],
[470, 87, 139, 465, 189, 367],
[115, 129, 237, 215, 19, 109],
[196, 462, 256, 125, 329, 379],
[241, 275, 472, 128, 176, 320],
[394, 330, 262, 169, 491, 99],
[406, 182, 190, 404, 71, 221],
[143, 161, 69, 156, 319, 28],
[ 95, 157, 52, 74, 380, 160],
[180, 70, 4, 477, 392, 465],
[406, 211, 116, 68, 324, 288],
[477, 182, 459, 381, 244, 466],
[337, 47, 383, 113, 124, 416],
[386, 202, 14, 129, 325, 209],
[444, 217, 39, 320, 474, 390],
[ 66, 258, 241, 149, 80, 496],
[ 50, 415, 410, 223, 429, 21],
[203, 104, 148, 56, 378, 75],
[277, 254, 172, 130, 142, 59],
[266, 140, 389, 154, 207, 452],
[ 76, 444, 25, 357, 30, 255],
[421, 499, 322, 347, 44, 189],
[142, 136, 50, 445, 234, 404],
[487, 478, 282, 290, 172, 96],
[ 75, 99, 82, 13, 148, 424],
[ 61, 73, 181, 363, 96, 406],
[ 71, 74, 490, 354, 364, 62],
[409, 76, 475, 491, 267, 398],
[422, 72, 272, 136, 140, 301],
[128, 55, 100, 236, 255, 499],
[ 13, 240, 254, 273, 59, 262],
[ 45, 474, 153, 132, 422, 391],
[264, 25, 382, 464, 440, 11],
[120, 32, 497, 321, 81, 343],
[165, 328, 284, 447, 279, 317],
[ 1, 247, 273, 145, 254, 47],
[107, 135, 222, 140, 221, 207],
[319, 387, 426, 86, 344, 481],
[447, 344, 139, 336, 191, 442],
[112, 173, 249, 371, 364, 246],
[403, 20, 378, 387, 492, 308],
[ 58, 206, 419, 378, 27, 487],
[167, 249, 340, 253, 389, 38],
[334, 27, 45, 112, 298, 359],
[498, 233, 72, 111, 304, 117],
[464, 285, 119, 433, 362, 7],
[374, 36, 101, 21, 141, 430],
[322, 80, 53, 184, 467, 330],
[236, 461, 6, 353, 80, 193],
[342, 178, 372, 227, 51, 460],
[179, 448, 51, 309, 87, 403],
[253, 329, 81, 28, 428, 490],
[156, 128, 201, 74, 71, 418],
[436, 393, 128, 370, 76, 115],
[359, 157, 111, 425, 28, 92],
[116, 377, 110, 37, 348, 329],
[355, 282, 200, 205, 301, 198],
[180, 390, 80, 183, 248, 116],
[340, 113, 79, 479, 218, 310],
[178, 334, 126, 470, 13, 405],
[450, 50, 141, 145, 153, 108],
[483, 120, 124, 94, 475, 259],
[191, 366, 456, 400, 390, 378],
[292, 245, 403, 321, 195, 138],
[213, 474, 62, 351, 136, 38],
[372, 314, 412, 191, 30, 244],
[ 78, 473, 100, 448, 36, 19],
[274, 78, 491, 29, 193, 243],
[ 13, 177, 31, 471, 44, 488],
[160, 310, 9, 43, 481, 498],
[219, 465, 486, 91, 460, 429],
[ 79, 326, 154, 337, 45, 8],
[402, 124, 242, 479, 438, 170],
[206, 354, 348, 133, 389, 0],
[ 57, 239, 31, 42, 157, 458],
[392, 71, 96, 134, 80, 436],
[233, 268, 193, 129, 70, 385],
[486, 111, 328, 219, 353, 371],
[303, 476, 352, 30, 490, 428],
[496, 59, 340, 332, 401, 389],
[ 66, 302, 250, 322, 131, 328],
[362, 407, 118, 237, 104, 72],
[192, 493, 1, 42, 301, 103],
[352, 402, 123, 435, 209, 314],
[216, 42, 485, 72, 392, 251],
[323, 36, 498, 9, 120, 327],
[207, 178, 495, 144, 102, 276],
[179, 476, 24, 51, 154, 69],
[ 19, 62, 450, 199, 382, 139]])
Any resource or reference will be helpful.
Thanks
Upvotes: 5
Views: 4380
Reputation: 80339
You can add rectangles of the desired size. The position (0, 1, 2, ...) depends on the index of the label you want to highlight. Setting clip_on=False
helps to also show the parts of the lines outside the main plot.
from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle
import seaborn as sns
import numpy as np
labels = list('abcdef')
N = len(labels)
ax = sns.heatmap(np.random.uniform(0, 1, (N, N)), cmap='summer', annot=True, linewidths=.5,
xticklabels=labels, yticklabels=labels)
wanted_label = 'c'
wanted_index = labels.index(wanted_label)
x, y, w, h = 0, wanted_index, N, 1
for _ in range(2):
ax.add_patch(Rectangle((x, y), w, h, fill=False, edgecolor='crimson', lw=4, clip_on=False))
x, y = y, x # exchange the roles of x and y
w, h = h, w # exchange the roles of w and h
ax.tick_params(length=0)
plt.show()
To incorporate this approach into the clustermap
:
from matplotlib import pyplot as plt
from matplotlib.patches import Rectangle
import seaborn as sns; sns.set()
import numpy as np
import pandas as pd
data = np.random.uniform(0, 1, size=(20, 6))
# data = np.array([[...]])
columns = list('abcdef')
N = len(columns)
PairWise = pd.DataFrame(columns=columns, data=data)
pairwise_corr = PairWise.corr(method="spearman")
g = sns.clustermap(pairwise_corr, method="complete", annot=True, linewidth=0.5)
wanted_label = 'f'
# wanted_row = np.where(np.array(columns)[g.dendrogram_row.reordered_ind] == wanted_label)[0]
# wanted_col = np.where(np.array(columns)[g.dendrogram_col.reordered_ind] == wanted_label)[0]
wanted_row = g.dendrogram_row.reordered_ind.index(columns.index(wanted_label))
wanted_col = g.dendrogram_col.reordered_ind.index(columns.index(wanted_label))
xywh_row = (0, wanted_row, N, 1)
xywh_col = (wanted_col, 0, 1, N)
for x, y, w, h in (xywh_row, xywh_col):
g.ax_heatmap.add_patch(Rectangle((x, y), w, h, fill=False, edgecolor='yellow', lw=4, clip_on=False))
g.ax_heatmap.tick_params(length=0)
plt.show()
Upvotes: 9