Построение диаграмм с накоплением областей для отдельных дней с Holoviews Holomap - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь построить голограмму на панде в формате данных в широкой форме. Фрейм данных имеет четыре столбца; Datetime, день, V1, V2. Дата и время имеют вид гггг-мм-дд чч: мм: сс с 15-минутным разрешением в течение двух дней. V1 и V2 содержат данные. После создания объекта HoloMap я могу получить доступ к отдельным сложенным диаграммам площадей, но когда я строю график всего объекта, я получаю данные за оба дня, откладываемые до конца, при этом селектор дня (kdim в Holomap) скрывает данные только за день выбран. Как заставить карту отображать данные только за выбранный день?

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

1 Ответ

1 голос
/ 25 марта 2019

Проблема в вашем примере заключается в том, что опция 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'])))

Здесь мы отделяем объявление данных от установки опций, что обычно является рекомендуемым подходом. Другой подход к переписыванию такого рода кода заключается в использовании возможностей HoloView для применения групповых операций. Если вы используете.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))

Обе версии производят это:

enter image description here

...