def plot_doy_heatmap(data, cmap='nipy_spectral', vmin=None, vmax=None,
overlay=None, title=None, figsize=(7.0, 3.0)):
"""
Create a day-of-year (X-axis) vs. time-of-day (Y-axis) heatmap.
Parameters
----------
data : pandas DataFrame or pandas Series
Data (single column), indexed by time
cmap : string (optional)
Colomap, default = nipy_spectral
vmin : float (optional)
Colomap minimum, default = None (autoscale)
vmax : float (optional)
Colomap maximum, default = None (autoscale)
overlay : pandas DataFrame (optional)
Data to overlay on the heatmap.
Time index should be in day-of-year (X-axis)
Values should be in time-of-day in minutes (Y-axis)
title : string (optional)
Title, default = None
figsize : tuple (optional)
Figure size, default = (7.0, 3.0)
"""
if type(data) is pd.core.series.Series:
data = data.to_frame()
# Convert data to a pivot table
col_name = data.columns[0]
data['X'] = data.index.dayofyear
data['Y'] = data.index.hour*60 + \
data.index.minute + \
data.index.second/60 + \
data.index.microsecond/(60*1000000.0)
piv = pd.pivot_table(data,values=col_name,index=['Y'],columns=['X'],fill_value=np.NaN)
# Create the heatmap
plt.figure(figsize = figsize)
fig, ax = plt.subplots(figsize=figsize)
im = ax.imshow(piv, cmap=cmap, aspect='auto', vmin=vmin, vmax=vmax,
extent=[data['X'].min()-0.5,data['X'].max()+0.5,
data['Y'].max()-0.5,data['Y'].min()+0.5])
fig.colorbar(im, ax=ax)
# Add overlay
if type(overlay) is pd.core.frame.DataFrame:
overlay.plot(ax=ax)
# Add title and labels
if title:
ax.set_title(title)
ax.set_xlabel("Day of the year")
ax.set_ylabel("Time of day (minutes)")
plt.tight_layout()
评论列表
文章目录