使用seaborn绘制热图时,可以将多行标记为一个标签吗?

When using seaborn to draw heatmap, can I mark multiple rows as one label?

我正在绘制热图。我想用它的类别替换原来的 y 轴。例如: 数据:

                    Location 1    Location 2      Location 3
cluster 1:    0       0.3           0.5              0.7
cluster 1:    1       1.2           3.1              1.2
cluster 1:    2       0.8           0.1              1.3
cluster 2:    3       0.2           0.3              1.0
cluster 2:    4       3.1           2.1              5
cluster 3:    5       0.9           0.7              0.2

我不想显示索引 (0,1,2,3,4,5),而是想显示多行的簇号。我该怎么做?

您可以遍历标签并将它们定位在平均值处。较小的 y 刻度可以用作分隔。

以下代码假定第一列具有聚类标签(并且不会用于热图本身)。

import pandas as pd
import seaborn as sns
from io import StringIO
import matplotlib.pyplot as plt
from matplotlib.ticker import FixedLocator

data_str = '''    cluster                "Location 1"    "Location 2"      "Location 3"
"cluster 1"         0.3           0.5              0.7
"cluster 1"         1.2           3.1              1.2
"cluster 1"         0.8           0.1              1.3
"cluster 2"         0.2           0.3              1.0
"cluster 2"         3.1           2.1              5
"cluster 3"         0.9           0.7              0.2'''

df = pd.read_csv(StringIO(data_str), delim_whitespace=True)
ax = sns.heatmap(df[df.columns[1:]], cmap='rocket_r', annot=True)

ax.xaxis.tick_top()
ticks = []
labels = []
prev_label = None
for i, label in enumerate(df['cluster']):
    if label != prev_label:
        ticks.append(i)
        labels.append(label)
        prev_label = label
ticks.append(i + 1)
ax.yaxis.set_minor_locator(FixedLocator(ticks))
ax.yaxis.set_major_locator(FixedLocator([(t0 + t1) / 2 for t0, t1 in zip(ticks[:-1], ticks[1:])]))
ax.set_yticklabels(labels, rotation=0)
ax.tick_params(axis='both', which='major', length=0)
ax.tick_params(axis='y', which='minor', length=60)
plt.tight_layout()
plt.show()