【问题标题】:Show dates on seaborn heatmap在 seaborn 热图上显示日期
【发布时间】:2018-01-02 20:26:51
【问题描述】:

我正在尝试使用 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 轴上没有打印任何内容。

【问题讨论】:

    标签: python pandas matplotlib seaborn dateformatter


    【解决方案1】:

    我在尝试做类似的事情时发现了这个问题,你可以拼凑出一个解决方案,但它不是很漂亮。

    例如,我获取当前标签,循环遍历它们以找到一月份的标签并将它们设置为仅年份,将其余标签设置为空白。

    这给了我正确位置的年份标签。

    xticklabels = ax.get_xticklabels()
    
    for label in xticklabels:
        text = label.get_text()
        if text[5:7] == '01':
            label.set_text(text[0:4])
        else:
            label.set_text('')
    
    ax.set_xticklabels(xticklabels)
    

    希望你能从中弄清楚你想做什么。

    【讨论】:

      【解决方案2】:

      Seaborn heatmap 是一个分类图。它从0 扩展到number of columns - 1,在这种情况下从0 扩展到366。日期时间定位器和格式化程序期望值作为日期(或更准确地说,对应于日期的数字)。对于有问题的年份,这将是 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()
      

      【讨论】:

      • 感谢您提供如此详细的解释。确实很有帮助。
      猜你喜欢
      • 2023-04-03
      • 2017-04-16
      • 2021-04-07
      • 2020-12-08
      • 1970-01-01
      • 2022-01-05
      • 2018-08-10
      • 2018-11-18
      相关资源
      最近更新 更多