使用pandas TimeSeries创建热力图

11

我需要使用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)

如果你没有明确定义你想要的内容,我会假设你的热力图是一个简单的二维直方图。那么为什么不将你的数据框重新采样/旋转到这个格式,并使用 plt.imshow(df_all.values) 绘制它呢? - Rutger Kassies
我只需要在Y轴上有5-20个项目,因为我理解imshow()需要指定直方图的每个点。 - szu
您可以根据TimeSeries列中的数据重新标记轴。如果将其绘制为图像并调整轴标签,则不必强制使用matplotlib函数使用该数据作为x轴数据。 - ely
1个回答

20

我不知道您指的时间序列热力图是什么,但对于数据帧,您可以按以下方式操作:

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)

热力图


1
但是,如果我在X轴上有数百个点,每分钟一个间隔,但我只需要显示每日刻度线,那么您的方法是否可以格式化日期? - szu
如果你想让热力图基于每日间隔,那么你需要先使用pandas的resample方法,否则只需修改set_xticksset_xticklabels函数的调用即可。 - behzad.nouri
@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。 - Anthony Kong
1
@AnthonyKong 不确定的话,尝试使用 df.iloc[i, j] - behzad.nouri
@behzad.nouri 抱歉,我刚刚弄明白了:"'{:.2f}'.format(" 不是有效的 Python 2.x 代码。 - Anthony Kong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接