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()
添加回答
舉報