使用 Holoviews Holomap 绘制个别日期的堆积面积图

Plotting stacked area charts for individual days with Holoviews Holomap

我正在尝试从 pandas 数据框以宽幅形式绘制全息图。数据框有四列;日期时间、日期、V1、V2。日期时间的格式为 yyyy-mm-dd hh:mm:ss,分辨率为两天的 15 分钟。 V1 和 V2 包含数据。创建 HoloMap 对象后,我可以访问单独的堆叠面积图,但是当我绘制整个对象时,我得到的是首尾相连的两天数据,日期选择器(Holomap 的 kdim)只隐藏当天的数据而不是选择。如何让地图只显示所选日期的数据?

import os, sys
import pandas as pd
import numpy as np
from datetime import datetime as DateTime
from holoviews import opts
import holoviews as hv
hv.extension('bokeh')
%matplotlib inline
opts.defaults(opts.Area(framewise=True))

tstamp = pd.date_range('2030-04-01',periods = 24*4*2,freq='15min')
V1 = np.random.randn(len(tstamp))
V2 = np.random.randn(len(tstamp))+5

df_in = pd.DataFrame({
            'Datetime':tstamp,
            'V1':V1,
            'V2':V2
        })
df_in['day'] = df_in.Datetime.dt.day
selected_days = df_in.day.unique()

testAreaHmap = hv.HoloMap({d: hv.Area.stack((hv.Area(df_in[df_in.day==d], label='V1',kdims=['Datetime'],vdims=['V1']).opts(color='orange')*\
                hv.Area(df_in[df_in.day==d], label='V2',kdims=['Datetime'],vdims=['V2']).opts(color='blue'))) for d in selected_days}, kdims=['d'])

testAreaHmap

您示例中的问题似乎是 framewise 选项没有生效,可能是因为内联选项 (.opts(color='orange')。因此,最直接的代码重写如下所示:

testAreaHmap = hv.HoloMap({d: hv.Area.stack((hv.Area(df_in[df_in.day==d], 'Datetime', 'V1', label='V1')*\
                                             hv.Area(df_in[df_in.day==d], 'Datetime', 'V2', label='V2')))
                           for d in selected_days}, kdims=['d'])

testAreaHmap.opts(opts.Area(framewise=True, color=hv.Cycle(['orange', 'blue'])))

这里我们将数据的声明与设置选项分开,这通常是推荐的方法。重写此类代码的另一种方法是使用 HoloViews 的功能来应用 groupby 操作。如果您使用的是 .to API 这将如下所示:

area_v1 = hv.Dataset(df_in).to(hv.Area, 'Datetime', 'V1', 'day', label='V1')
area_v2 = hv.Dataset(df_in).to(hv.Area, 'Datetime', 'V2', 'day', label='V2')
stacked_areas = (area_v1 * area_v2).map(hv.Area.stack, hv.Overlay)

stacked_areas.opts(opts.Area(color=hv.Cycle(['orange', 'blue']), framewise=True))

两个版本都产生了这个: