Seaborn 热图更改 yticks 的日期频率

Seaborn heatmap change date frequency of yticks

我的问题与在这个主题上遇到的问题类似:

我希望每 6 个月有一次 yticks,它们是我的数据框的索引。但我无法让它发挥作用。

问题是我的数据帧是 13500*290 并且 link 中给出的答案需要很长时间并且实际上不起作用(见下图)。

这是我的代码示例,没有来自 link 的解决方案,这部分对我来说很好用:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

df = pd.DataFrame(index = pd.date_range(datetime(1984, 6, 10), datetime(2021, 1, 14), freq='1D') )

for i in range(0,290):
    df['Pt{0}'.format(i)] = np.random.random(size=len(df))
    
f, ax = plt.subplots(figsize=(20,20))
sns.heatmap(df, cmap='PuOr', vmin = np.min(np.min(df)), vmax = np.max(np.max(df)), cbar_kws={"label": "Ice Velocity (m/yr)"}) 

这部分对我不起作用并生成下图,它不应该在 yaxis 上有一堆 ylabels:

f, ax = plt.subplots(figsize=(20,20))
years = df.index.get_level_values(0)
ytickvalues = [year if index in (2, 7, 12) else '' for index, year in enumerate(years)]
sns.heatmap(df, cmap='PuOr', vmin = np.min(np.min(df)), vmax = np.max(np.max(df)), cbar_kws={"label": "Ice Velocity (m/yr)"}, yticklabels = ytickvalues) 

这里有几种方法可以使 link 适合您的用例(每 6 个月 1 个标签):

  1. 要么: 显示一个空字符串,但 Jan 1 和 Jul 1 除外(即,当 %m%d 计算为 01010701)

    labels = [date if date.strftime('%m%d') in ['0101', '0701'] else ''
              for date in df.index.date]
    
  2. 或: 显示一个空字符串,除了每隔 ~365/2 天(即当 row % 183 == 0

    labels = [date if row % 183 == 0 else ''
              for row, date in enumerate(df.index.date)]
    

请注意,您没有 MultiIndex,因此您可以只使用 df.index.date(不需要 get_level_values)。


这是您的 df:

的最小化版本的输出
sns.heatmap(df, cmap='PuOr', cbar_kws={'label': 'Ice Velocity (m/yr)'},
            vmin=df.values.min(), vmax=df.values.max(),
            yticklabels=labels)