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 个标签):
要么: 显示一个空字符串,但 Jan 1 和 Jul 1 除外(即,当 %m%d
计算为 0101
或0701
)
labels = [date if date.strftime('%m%d') in ['0101', '0701'] else ''
for date in df.index.date]
或: 显示一个空字符串,除了每隔 ~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)
我的问题与在这个主题上遇到的问题类似:
我希望每 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 个标签):
要么: 显示一个空字符串,但 Jan 1 和 Jul 1 除外(即,当
%m%d
计算为0101
或0701
)labels = [date if date.strftime('%m%d') in ['0101', '0701'] else '' for date in df.index.date]
或: 显示一个空字符串,除了每隔 ~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)