繁体   English   中英

python seaborn 热图用绝对颜色框替换颜色条

[英]python seaborn heatmap replace colorbar with absolute colorboxes

我有一个仅包含 -1、0 和 1 绝对值的热图

import random 
import numpy as np
import matplotlib
import seaborn as sb
import matplotlib.pyplot as plt

array = []
for x in range(10):
    array.append(random.choices([-1,0, 1], k = 5))
array = np.array(array)


heatmap = sb.heatmap(array, cbar_kws={'ticks': [-1, 0 , 1]}, cmap = ["red", "grey", "green"])
plt.show()

是否可以删除颜色条并将其替换为三个不同的彩色框和自定义 label,就像您在条形图的传说中所期望的那样? IE 一个红色框和旁边的“No”一词,一个灰色的框和旁边的“N/A”一词,以及一个绿色的框,旁边有“yes”这个词

您可以使用 matplotlib 手动完成。 为了创建盒子,我们做了一个散点图 plot,每种颜色都有正方形,但没有数据,所以它们不会出现。 我们将这些散点图的返回值保存为句柄以传递给图例。 然后,我们从 heatmap 变量中获取heatmap figure object,其中包含 plot 所在的轴。 在那里,我们使用自定义句柄和标签创建一个图例。 在该图上调用subplots_adjust ,我们为右侧的图例腾出空间。

import random 
import numpy as np
import matplotlib
import seaborn as sb
import matplotlib.pyplot as plt

array = []
for x in range(10):
    array.append(random.choices([-1,0, 1], k = 5))
array = np.array(array)

colors = ["red", "grey", "green"]
heatmap = sb.heatmap(array, cmap = ["red", "grey", "green"], cbar=False)

#Create dummy handles using scatter
handles = [plt.scatter([], [], marker='s', s=50, color=color) for color in colors]
labels = [-1, 0 , 1]
#Creating the legend using dummy handles
heatmap.figure.legend(handles=handles, labels=labels, loc='center right', frameon=False)
#Adjusting the plot space to the right to make room for the legend
heatmap.figure.subplots_adjust(right=0.8)
plt.show()

在旁注中:

您可以将生成随机数组的代码替换为 numpy function,这正是您想要的,但更方便。

所以替换这个:

array = []
for x in range(10):
    array.append(random.choices([-1,0, 1], k = 5))
array = np.array(array)

有了这个:

array = np.random.choice((-1, 0, 1), (10, 5))

其中第一个参数是选择,第二个参数是数组的形状,所以在你的情况下是 10 乘 5。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM