1 回答
TA贡献1796条经验 获得超4个赞
您可以循环浏览标签并将它们放置在平均值处。小 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()
添加回答
举报