Построение только верхнего / нижнего треугольника тепловой карты

В maptplotlib можно создать представление тепловой карты корреляционной матрицы с помощью функции imshow. По определению такая матрица симметрична относительно своей главной диагонали, поэтому нет необходимости представлять одновременно верхний и нижний треугольники. Например:  корреляционная матрица
(источник: wisc.edu)

Приведенный выше пример был взят с этого сайта К сожалению, мне не удалось выяснить, как это сделать в matplotlib. Если установить для верхней / нижней части матрицы значение «Нет», появится черный треугольник. Я искал в Google отсутствующие значения matplotlib, но не нашел ничего полезного


person Boris Gorelik    schedule 23.02.2010    source источник
comment
Может, просто отфотошопили :)   -  person endolith    schedule 15.05.2011
comment
Ответьте другим способом   -  person tedd    schedule 26.12.2020


Ответы (5)


Проблема с ответом, предоставленным Дугом, заключается в том, что он полагается на тот факт, что цветовая карта отображает нулевые значения на белый. Это означает, что цветовые карты, не включающие белый цвет, бесполезны. Ключ к решению - cm.set_bad функция. Вы маскируете ненужные части матрицы с помощью None или маскированных массивов NumPy и set_bad в белый цвет вместо черного по умолчанию. Взяв пример Дуга, мы получим следующее:

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)
PLT.show()
person Boris Gorelik    schedule 25.02.2010
comment
отлично! также работает с pcolormesh, для чего мне и понадобилось это решение. Также обратите внимание, чтобы исключить диагональ, а также измените k=-1 на k=0 в строке mask=NP.tri(A.shape[0],k=0) - person Vlox; 10.05.2017
comment
@Vlox, привет. Мне было интересно, как мне замаскировать верхний треугольник? - person chitown88; 28.06.2019
comment
@ chitown88 должен просто иметь возможность транспонировать матрицу перед построением, поэтому просто добавьте .T в строку A = NP.ma.array(A, mask=mask).T - person Vlox; 05.07.2019
comment
@Vlox, ну ладно. Я сделал это немного по-другому, но в вашем гораздо больше смысла. - person chitown88; 05.07.2019

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)
# create an upper triangular 'matrix' from A
A2 = NP.triu(A)
fig = PLT.figure()
ax1 = fig.add_subplot(111)
# use dir(matplotlib.cm) to get a list of the installed colormaps
# the "_r" means "reversed" and accounts for why zero values are plotted as white
cmap = CM.get_cmap('gray_r', 10)
ax1.imshow(A2, interpolation="nearest", cmap=cmap)
ax1.grid(True)
PLT.show()

сюжет

person doug    schedule 23.02.2010
comment
Спасибо, что включили импорт. Очень полезны исполняемые примеры. - person jcdyer; 23.02.2010

Лучший ответ, который я получил, был от Seaborn. На выходе получается гладкая и простая на вид фигура. Эта функция сохраняет треугольник в локальный

def get_lower_tri_heatmap(df, output="cooc_matrix.png"):
    mask = np.zeros_like(df, dtype=np.bool)
    mask[np.triu_indices_from(mask)] = True

    # Want diagonal elements as well
    mask[np.diag_indices_from(mask)] = False

    # Set up the matplotlib figure
    f, ax = plt.subplots(figsize=(11, 9))

    # Generate a custom diverging colormap
    cmap = sns.diverging_palette(220, 10, as_cmap=True)

    # Draw the heatmap with the mask and correct aspect ratio
    sns_plot = sns.heatmap(data, mask=mask, cmap=cmap, vmax=.3, center=0,
            square=True, linewidths=.5, cbar_kws={"shrink": .5})
    # save to file
    fig = sns_plot.get_figure()
    fig.savefig(output)

Нижний треугольник

person Itachi    schedule 04.12.2019

Вы можете построить над одной белой матрицей с прозрачной верхней / нижней частью

a =random((10,10))
imshow(a, interpolation='nearest')

b = ones(a.shape+(4,)) # «white» matrix with alpha=1
for i in range(a.shape[0]):
    for j in range(i, a.shape[1]):
        b[i,j,3] = 0   # upper triangle, alpha = 0
imshow(b, interpolation='nearest')

http://lh5.ggpht.com/_ZgVr3-a-Z00/S4P3_BWByKI/AAAAAAAAAXE/UsJpokz6LKE/pp.png

person remosu    schedule 23.02.2010

С seaborn, matplotlib и numpy быстрое решение:

import matplotlib.pyplot as plt
import seaborn as sns

# Say your matrix object (e.g. np.array) is corr_mat

# Get the upper triangle without the diagonal 
corr_mat = np.triu(corr_mat, k=1)

# Plot the heatmap
ax = sns.heatmap(corr_mat)

См. seaborn онлайн-документ по макияжу.

person tagoma    schedule 12.01.2017
comment
Это работает, но из-за возможного нежелательного побочного эффекта были удалены имена столбцов и, таким образом, удалена возможность выполнения xticklabels=corr.columns.values. Обходной путь - сначала объявить имена (например, xnames=corr.columns.values), затем использовать np.triu(), а затем отправить xticklabels=xnames в качестве параметра - person Mitchell van Zuylen; 13.03.2018
comment
@tagoma на самом деле показывает нули под диагональю. Как удалить эти ячейки вместо того, чтобы показывать нули - person Khurram Majeed; 14.03.2018