如何解决使用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)
,而是要显示多行的集群号。我该怎么办?
解决方法
您可以遍历标签并将它们定位在平均值处。较小的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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。