将matplotlib转换为交互式holoviews +数据着色器可视化最好使用交互式笔刷

问题描述

如何将以下图移植到hvplot + datashader?

enter image description here

理想情况下,可以保留交互性,并且可以交互地选择某些device_id 。 (理想情况下,使用笔刷,例如,当我选择一个异常点时,我希望能够过滤到基础序列,但是如果这不起作用,则也许可以从列表中选择它们也可以。请记住,该列表可能会很长(在1000个元素的范围内)。

%pylab inline
import seaborn as sns; sns.set()
import pandas as pd
from pandas import Timestamp

d = pd.DataFrame({'metrik_0': {Timestamp('2020-01-01 00:00:00'): -0.5161200349325471,Timestamp('2020-01-01 01:00:00'): 0.6404118012330947,Timestamp('2020-01-01 02:00:00'): -1.0127867504877557,Timestamp('2020-01-01 03:00:00'): 0.25828987625529976,Timestamp('2020-01-01 04:00:00'): -2.486778084008076,Timestamp('2020-01-01 05:00:00'): -0.30695039872663826,Timestamp('2020-01-01 06:00:00'): -0.6570670310316116,Timestamp('2020-01-01 07:00:00'): 0.3274964731894147,Timestamp('2020-01-01 08:00:00'): -0.8624113311084097,Timestamp('2020-01-01 09:00:00'): 1.0832911260447902},'device_id': {Timestamp('2020-01-01 00:00:00'): 9,Timestamp('2020-01-01 01:00:00'): 1,Timestamp('2020-01-01 02:00:00'): 1,Timestamp('2020-01-01 03:00:00'): 9,Timestamp('2020-01-01 04:00:00'): 9,Timestamp('2020-01-01 05:00:00'): 9,Timestamp('2020-01-01 06:00:00'): 9,Timestamp('2020-01-01 07:00:00'): 1,Timestamp('2020-01-01 08:00:00'): 1,Timestamp('2020-01-01 09:00:00'): 9}})

fig,ax = plt.subplots()
for dev,df in d.groupby('device_id'):
    df.plot(y='metrik_0',ax=ax,label=dev)

到目前为止,我只能实现:

import pandas as pd
import datashader as ds
import numpy as np
import holoviews as hv

from holoviews import opts

from holoviews.operation.datashader import datashade,shade,dynspread,rasterize
from holoviews.operation import decimate

hv.extension('bokeh','matplotlib')

width = 1200
height = 400
curve = hv.Curve(d)

datashade(curve,cmap=["blue"],width=width,height=height).opts(width=width,height=height)

enter image description here

理想情况下,我可以突出显示类似于matplotlib的某些范围:axvspan

解决方法

只要您希望达到100,000点左右,就不需要Datashader:

import pandas as pd
import hvplot.pandas
from pandas import Timestamp

df = pd.DataFrame(
       {'metrik_0': {
          Timestamp('2020-01-01 00:00:00'): -0.5161200349325471,Timestamp('2020-01-01 01:00:00'): 0.6404118012330947,Timestamp('2020-01-01 02:00:00'): -1.0127867504877557,Timestamp('2020-01-01 03:00:00'): 0.25828987625529976,Timestamp('2020-01-01 04:00:00'): -2.486778084008076,Timestamp('2020-01-01 05:00:00'): -0.30695039872663826,Timestamp('2020-01-01 06:00:00'): -0.6570670310316116,Timestamp('2020-01-01 07:00:00'): 0.3274964731894147,Timestamp('2020-01-01 08:00:00'): -0.8624113311084097,Timestamp('2020-01-01 09:00:00'): 1.0832911260447902},'device_id': {
          Timestamp('2020-01-01 00:00:00'): 9,Timestamp('2020-01-01 01:00:00'): 1,Timestamp('2020-01-01 02:00:00'): 1,Timestamp('2020-01-01 03:00:00'): 9,Timestamp('2020-01-01 04:00:00'): 9,Timestamp('2020-01-01 05:00:00'): 9,Timestamp('2020-01-01 06:00:00'): 9,Timestamp('2020-01-01 07:00:00'): 1,Timestamp('2020-01-01 08:00:00'): 1,Timestamp('2020-01-01 09:00:00'): 9}})

df.hvplot(by='device_id')

hvplot

如果要使用vspan,可以从HoloViews获得它:

import holoviews as hv
        
vspan = hv.VSpan(Timestamp('2020-01-01 04:00:00'),Timestamp('2020-01-01 06:00:00'))
                 
df.hvplot(by='device_id') * vspan.opts(color='red')

vspan

如果您确实需要Datashader,则可以使用它,但是如果不做进一步的工作就无法选择结果:

df.hvplot(by='device_id',datashade=True,dynspread=True) * vspan.opts(color='red')

datashader

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...