使用 Pandas TimeSeries 创建热图

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20520246/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 21:26:05  来源:igfitidea点击:

Create heatmap using pandas TimeSeries

pythondatetimenumpymatplotlibpandas

提问by szu

I need to create MatplotLib heatmap (pcolormesh) using Pandas DataFrame TimeSeries column (df_all.ts) as my X-axis.

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

How to convert Pandas TimeSeries column to something which can be used as X-axis in np.meshgrid(x, y) function to create heatmap? The workaround is to create Matplotlib drange using same parameters as in pandas column, but is there a simple way?

如何将 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)

回答by behzad.nouri

I do not know what you mean by heat map for a time series, but for a dataframe you may do as below:

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

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()

optionally, to print actual values in the middle of each square, with some shadows for readability, you may do:

可选地,要在每个方块的中间打印实际值,并带有一些阴影以提高可读性,您可以执行以下操作:

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)

heat-map

热图