使用 pandas TimeSeries 创建热图

Posted

技术标签:

【中文标题】使用 pandas TimeSeries 创建热图【英文标题】:Create heatmap using pandas TimeSeries 【发布时间】:2013-12-29 11:47:42 【问题描述】:

我需要使用 Pandas DataFrame TimeSeries 列 (df_all.ts) 作为我的 X 轴来创建 MatplotLib 热图 (pcolormesh)。

如何将 Pandas TimeSeries 列转换为可用作 np.meshgrid(x, y) 函数中的 X 轴以创建热图的内容?解决方法是使用与 pandas 列中相同的参数创建 Matplotlib drange,但是有简单的方法吗?

x = pd.date_range(df_all.ts.min(),df_all.ts.max(),freq='H')
xt = mdates.drange(df_all.ts.min(), df_all.ts.max(), dt.timedelta(hours=1))
y = arange(ylen)
X,Y = np.meshgrid(xt, y)

【问题讨论】:

如果没有明确定义您想要什么,我假设您的热图是一个简单的 2D 直方图。那么你为什么不重新采样/旋转你的 DF 并用plt.imshow(df_all.values) 绘制它呢? 我只需要 Y 轴上的 5-20 个项目,因为我知道 imshow() 需要指定直方图的每个点 您始终可以根据 TimeSeries 列中的数据重新标记轴。如果绘制为图像有效,则不要强调强制 matplotlib 函数将该数据准确用作 x 轴数据,然后调整轴标签。 【参考方案1】:

我不知道您所说的时间序列热图是什么意思,但对于数据框,您可以执行以下操作:

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

from itertools import product
from string import ascii_uppercase
from matplotlib import patheffects

m, n = 4, 7 # 4 rows, 7 columns
df = pd.DataFrame(np.random.randn(m, n),
                  columns=list(ascii_uppercase[:n]),
                  index=list(ascii_uppercase[-m:]))


ax = plt.imshow(df, interpolation='nearest', cmap='Oranges').axes

_ = ax.set_xticks(np.linspace(0, n-1, n))
_ = ax.set_xticklabels(df.columns)
_ = ax.set_yticks(np.linspace(0, m-1, m))
_ = ax.set_yticklabels(df.index)

ax.grid('off')
ax.xaxis.tick_top()

可选地,要在每个正方形的中间打印实际值,并带有一些阴影以提高可读性,您可以这样做:

path_effects = [patheffects.withSimplePatchShadow(shadow_rgbFace=(1,1,1))]

for i, j in product(range(m), range(n)):
    _ = ax.text(j, i, '0:.2f'.format(df.iloc[i, j]),
                size='medium', ha='center', va='center',
                path_effects=path_effects)

【讨论】:

但是,如果我在 X 上以分钟为间隔有数百个点,那么您的方法有没有办法格式化日期,但我只需要显示每日刻度? @szu 如果希望热图也基于每日间隔,则需要先使用 pandas resample 方法,否则只需修改 set_xticksset_xticklabels 调用 @behzad.nouri 当我运行打印实际值代码时,出现此错误:“ax.text(j, i, ':.2f'.format(df.iget_value(i , j)), ValueError: zero length field name in format" 你知道为什么吗?Pandas 版本 0.14.1 和 python 2.6.6 @AnthonyKong 不确定,试试df.iloc[i, j] @behzad.nouri 抱歉,请弄清楚:"':.2f'.format(" is not valid python 2.x code

以上是关于使用 pandas TimeSeries 创建热图的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fill_value 对 Pandas 中的 TimeSeries 重新采样?

使用 Pandas TimeSeries 编码变量

来自带有 NaN 的 pandas 数据框的 seaborn 热图

pandas timeseries DF 切片和选择

使用 Pandas 数据框中的值注释热图

将 Pandas TimeSeries 导入 MongoDB