如果您的数据只是 10 的倍数且介于 0 到 60 之间,您可以直接使用它们来绘制热图。
您可以提供 7 种颜色,例如标准颜色图的 6 种颜色和值 60 的一种特殊颜色。这是一些示例代码。 vmin 和 vmax 设置为使颜色条自动设置颜色附近的正确值。
您也可以只使用 7 种颜色的列表,例如 colors = ['dodgerblue', 'gold', 'lime', 'purple', 'turquoise', 'orange', 'crimson'],或使用具有不同颜色的颜色图(例如 cmap=sns.color_palette('tab10', 7, as_cmap=True))。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
data = np.random.randint(0, 7, (45, 50)) * 10.0
fig, ax = plt.subplots(figsize=(8, 5))
colors = sns.color_palette('mako', 6) + ['crimson']
sns.heatmap(data=data, cmap=sns.color_palette(colors, as_cmap=True), vmin=-5, vmax=65, ax=ax)
# sns.heatmap(data=data, cmap=sns.color_palette('tab10', 7, as_cmap=True), vmin=-5, vmax=65, ax=ax)
plt.tight_layout()
plt.show()
这是 14 个数字的方法。 np.unique(data, return_inverse=True) 返回一个包含所有唯一值的数组以及一个映射,其中包含哪个值的位置。这些位置以 1D 列表的形式给出,需要重新整形为 2D。 'tab20' 颜色图最多有 20 种不同的颜色,尽管有些颜色可能难以区分。请参阅 here 获取定性颜色图列表。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# values between -11 and 61, maximum 15 different values
data = np.random.choice(np.random.randint(-11, 61, 15), (45, 50))
values, positions = np.unique(data, return_inverse=True)
positions = positions.reshape(data.shape)
fig, ax = plt.subplots(figsize=(14, 7))
colors = sns.color_palette('tab20', len(values))
N = len(values)
colors = sns.color_palette('tab20', N)
# or you can give your own list: colors = ['red', 'green', ....][:N]
sns.heatmap(data=positions, cmap=sns.color_palette(colors, as_cmap=True), vmin=-0.5, vmax=N - 0.5,
annot=data, fmt='.0f', annot_kws={'size': 6},
cbar_kws={'ticks': range(N)}, ax=ax)
fig.axes[-1].set_yticklabels(values)
plt.tight_layout()
plt.show()