Python 使用pandas TimeSeries创建热图

Python 使用pandas TimeSeries创建热图,python,datetime,numpy,matplotlib,pandas,Python,Datetime,Numpy,Matplotlib,Pandas,我需要使用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 = m

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

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

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)

如果不清楚您想要什么,我假设您的热图是一个简单的二维直方图。那么,为什么不重新采样/旋转DF到这个位置,并用
plt.imshow(DF_all.values)
绘制它呢?我只需要Y轴上的5-20个项目,因为我知道imshow()需要指定历史图的每个点。你总是可以根据TimeSeries列中的数据重新标记轴。如果以图像方式打印,请不要强调强制matplotlib函数将该数据精确用作x轴数据,然后调整轴标签。但是,如果x上有数百个点,且间隔很短,是否有办法格式化日期,但是我只需要显示每日滴答声?@szu如果您希望热图也基于每日间隔,那么您需要首先使用pandas
resample
方法,否则只需修改
set_xticks
set_xticklabels
calls@behzad.nouri当我运行打印实际值代码时,我得到了这个错误:“ax.text(j,i,”{.2f}'.format(df.iget_value(i,j)),ValueError:格式为“Do u know why?Pandas version 0.14.1和python 2.6”的零长度字段名。6@AnthonyKong不确定,请尝试使用
df.iloc[i,j]
@behzad.nouri抱歉,请找出:“{.2f}.”格式(“不是有效的python 2.x代码