python - 在 seaborn 热图上显示日期

标签 python pandas matplotlib seaborn dateformatter

我正在尝试使用 seaborn 库从 pandas 数据框创建热图。这是代码:

test_df = pd.DataFrame(np.random.randn(367, 5), 
                 index = pd.DatetimeIndex(start='01-01-2000', end='01-01-2001', freq='1D'))

ax = sns.heatmap(test_df.T)
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_minor_locator(mdates.DayLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b'))
ax.xaxis.set_minor_formatter(mdates.DateFormatter('%d'))

但是,我得到的图形在 x 轴上没有打印任何内容。

enter image description here

最佳答案

Seaborn heatmap 是一个分类图。它从 0number of columns - 1,在本例中从 0366。日期时间定位器和格式化程序期望值为日期(或更准确地说,对应于日期的数字)。对于所讨论的年份,这将是 730120 (= 01-01-2000) 和 730486 (= 01-01-2001) 之间的数字。

因此,为了能够使用 matplotlib.dates 格式化程序和定位器,您需要先将数据帧索引转换为日期时间对象。然后您可以不使用热图,而是使用允许数字轴的图,例如imshow 图。然后,您可以设置该 imshow 图的范围以对应于您要显示的日期范围。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df = pd.DataFrame(np.random.randn(367, 5), 
                 index = pd.DatetimeIndex(start='01-01-2000', end='01-01-2001', freq='1D'))

dates = df.index.to_pydatetime()
dnum = mdates.date2num(dates)
start = dnum[0] - (dnum[1]-dnum[0])/2.
stop = dnum[-1] + (dnum[1]-dnum[0])/2.
extent = [start, stop, -0.5, len(df.columns)-0.5]

fig, ax = plt.subplots()
im = ax.imshow(df.T.values, extent=extent, aspect="auto")

ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_minor_locator(mdates.DayLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b'))

fig.colorbar(im)
plt.show()

enter image description here

关于python - 在 seaborn 热图上显示日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45345177/

相关文章:

python - numpy.interp 和屏蔽数组

python - QThread:线程仍在运行时被销毁

python - 向 pandas 的每一列添加特定数量

python - 如何在 Pandas 中创建日期时间索引

python - Mat plot lib 绘制图像而不是保存(facebook detectron 代码)

matplotlib - 如何让 matplotlib 的 `subplots` 中的每个图使用不同的轴?

python - 增量matplotlib颜色循环

python - 为什么不同实例的字段在 python 模块中会混合在一起?

python子进程和grep命令

python - 为什么我不能将数组分配给 pandas DataFrame 列?