使用 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))
两个版本都产生了这个:
我正在尝试从 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))
两个版本都产生了这个: