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

我正在绘制热图。我想用它的类别替换原来的 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),而是想显示多行的簇号。我怎样才能做到这一点?


慕斯709654
浏览 81回答 1
1回答

SMILET

您可以循环浏览标签并将它们放置在平均值处。小 y 刻度线可以用作分隔符。以下代码假设第一列具有集群标签(并且不会用于热图本身)。import pandas as pdimport seaborn as snsfrom io import StringIOimport matplotlib.pyplot as pltfrom matplotlib.ticker import FixedLocatordata_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 = Nonefor i, label in enumerate(df['cluster']):    if label != prev_label:        ticks.append(i)        labels.append(label)        prev_label = labelticks.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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python