【问题标题】:Python heatmap and colorbar colors are differentPython热图和颜色条颜色不同
【发布时间】:2019-03-08 15:56:08
【问题描述】:

我正在使用 matplotlib 和 seaborn 创建我的相关矩阵的热图,其中特定颜色代表数据范围。我面临一个问题,即我的颜色条不能代表热图中的全部颜色。 编辑:问题在于-0.5到-0.3范围内的颜色条。这里的颜色应该是“宝蓝色”。正确的颜色显示在热图中,而不是颜色条。

这是我的热图代码:

from matplotlib import colors
cmap = colors.ListedColormap(["navy", "royalblue", "lightsteelblue", "beige", "peachpuff", "salmon", "darkred"])
bounds = [-1, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)

这适用于我的数据,corr_matrix。

#Generate mask for correlation matrix
mask = np.zeros_like(corr_matrix, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True

#print the correlation matrix
fig, ax = plt.subplots()
sns.heatmap(corr_matrix, annot=True, fmt='.4f', cmap=cmap, norm=norm, mask=mask, cbar=True, ax=ax, cbar_kws=dict(ticks=[-1, -0.5, -0.3, -0.1, +0.1, +0.3, +0.5, +1]))
ax.set_title('Correllation Matrix')
ax.set_yticklabels(ax.get_yticklabels(), rotation="horizontal")
plt.show()

谢谢!

【问题讨论】:

  • 看起来热图颜色与您的颜色条正确对齐。颜色条涵盖从 -1 到 1 的值范围。热图中的值不使用 -1 到 1 的完整范围,因此您看不到颜色条最末端的某些颜色。还是我误解了您要做什么?
  • 我认为“唯一”的问题是颜色条在 [-0.5,-0.3] 范围内显示错误的颜色,对吗?其他一切看起来都符合预期。
  • 看看documentation on sns correlation matrix。您正在使用cbar_kws,它绝对有效,并且根据您传递的ticks=[-1, -0.5, -0.3, -0.1, +0.1, +0.3, +0.5, +1] 准确返回预期的结果。但在文档中查看vmax=center=,还有一个vmin=。随意将您需要的值放在那里并“让代码完成剩下的工作”我使用链接文档方法,因为它对于非 Python 本地人 (IMO) 更具可读性。但是请用什么错误更新您的问题
  • @MattR 您不能在这里使用vmaxcenter 来实现不相等的分箱。

标签: python pandas numpy matplotlib seaborn


【解决方案1】:

这看起来像是一个海运问题。使用纯 matplotlib 时,

im = ax.imshow(np.ma.masked_array(corr_matrix, mask), cmap=cmap, norm=norm)
fig.colorbar(im, ticks=[-1, -0.5, -0.3, -0.1, +0.1, +0.3, +0.5, +1])

结果符合预期。

然后,要复制 seaborn 情节的确切外观需要更多的工作,

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

corr_matrix = np.array([[0,0,0,0,0],
                        [-.11,0,0,0,0],
                        [-.1,.34,0,0,0],
                        [-0.06,-.1,-.06,0,0],
                        [-0.32,-.08,-.01,.16,0]])

cmap = colors.ListedColormap(["navy", "royalblue", "lightsteelblue", 
                              "beige", "peachpuff", "salmon", "darkred"])
bounds = [-1, -0.5, -0.3, -0.1, 0.1, 0.3, 0.5, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)

mask = np.zeros_like(corr_matrix, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
corr_matrix_masked = np.ma.masked_array(corr_matrix, mask)

fig, ax = plt.subplots()

im = ax.imshow(corr_matrix_masked, cmap=cmap, norm=norm)
fig.colorbar(im, ticks=[-1, -0.5, -0.3, -0.1, +0.1, +0.3, +0.5, +1])

for i in range(corr_matrix_masked.shape[0]):
    for j in range(corr_matrix_masked.shape[1]):
        if not corr_matrix_masked.mask[i,j]:
            val = corr_matrix_masked[i,j]
            color = {True:"w", False:"k"}[np.abs(val) > 0.3]
            ax.text(j,i,"{:.4f}".format(corr_matrix_masked[i,j]), 
                    ha="center", va="center", color=color)

ax.set_title('Correllation Matrix')
for k,v in ax.spines.items():
    v.set_visible(False)
plt.show()

【讨论】:

  • 非常感谢,这很有用!
猜你喜欢
  • 2016-07-20
  • 2021-01-11
  • 1970-01-01
  • 2018-05-07
  • 2023-03-25
  • 1970-01-01
  • 2015-10-07
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多