如何使用 ipywidgets SelectionRangeSlider 更新 holoviews Bars?
How to update holoviews Bars using an ipywidgets SelectionRangeSlider?
我想通过 SelectionRangeSlider
从 Jupyter-notebook 中的某些 pandas DataFrame select 数据,并使用 holoviews 条形图绘制过滤后的数据。
考虑以下示例:
import numpy as np
import pandas as pd
import datetime
import holoviews as hv
hv.extension('bokeh')
import ipywidgets as widgets
start = int(datetime.datetime(2017,1,1).strftime("%s"))
end = int(datetime.datetime(2017,12,31).strftime("%s"))
size = 100
rints = np.random.randint(start, end + 1, size = size)
df = pd.DataFrame(rints, columns = ['zeit'])
df["bytes"] = np.random.randint(5,20,size=size)
df['who']= np.random.choice(['John', 'Paul', 'George', 'Ringo'], len(df))
df["zeit"] = pd.to_datetime(df["zeit"], unit='s')
df.zeit = df.zeit.dt.date
df.sort_values('zeit', inplace = True)
df = df.reset_index(drop=True)
df.head(2)
这给出了测试 DataFrame df
:
让我们对数据进行分组:
data = pd.DataFrame(df.groupby('who')['bytes'].sum())
data.reset_index(level=0, inplace=True)
data.sort_values(by="bytes", inplace=True)
data.head(2)
现在,创建要用于筛选和更新条形图的 SelectionRangeSlider
。
%%opts Bars [width=800 height=400 tools=['hover']]
def view2(v):
x = df[(df.zeit > r2.value[0].date()) & (df.zeit < r2.value[1].date())]
data = pd.DataFrame(x.groupby('who')['bytes'].sum())
data.sort_values(by="bytes", inplace=True)
data.reset_index(inplace=True)
display(hv.Bars(data, kdims=['who'], vdims=['bytes']))
r2 = widgets.SelectionRangeSlider(options = options, index = index, description = 'Test')
widgets.interactive(view2, v=r2)
(我已经在 github 上创建了一个滑块未正确显示标签的问题,https://github.com/jupyter-widgets/ipywidgets/issues/1759)
持续存在的问题:
图像宽度和大小在第一次更新后折叠为默认值(有没有办法将 %%opts
作为 hv.Bars
的参数?)
y-Scale 应保持不变(即所有更新从 0 到 150)
更新速度有没有优化的可能?
感谢您的帮助。
想出了使用 bokeh
的方法:https://github.com/bokeh/bokeh/issues/7082
我想通过 SelectionRangeSlider
从 Jupyter-notebook 中的某些 pandas DataFrame select 数据,并使用 holoviews 条形图绘制过滤后的数据。
考虑以下示例:
import numpy as np
import pandas as pd
import datetime
import holoviews as hv
hv.extension('bokeh')
import ipywidgets as widgets
start = int(datetime.datetime(2017,1,1).strftime("%s"))
end = int(datetime.datetime(2017,12,31).strftime("%s"))
size = 100
rints = np.random.randint(start, end + 1, size = size)
df = pd.DataFrame(rints, columns = ['zeit'])
df["bytes"] = np.random.randint(5,20,size=size)
df['who']= np.random.choice(['John', 'Paul', 'George', 'Ringo'], len(df))
df["zeit"] = pd.to_datetime(df["zeit"], unit='s')
df.zeit = df.zeit.dt.date
df.sort_values('zeit', inplace = True)
df = df.reset_index(drop=True)
df.head(2)
这给出了测试 DataFrame df
:
让我们对数据进行分组:
data = pd.DataFrame(df.groupby('who')['bytes'].sum())
data.reset_index(level=0, inplace=True)
data.sort_values(by="bytes", inplace=True)
data.head(2)
现在,创建要用于筛选和更新条形图的 SelectionRangeSlider
。
%%opts Bars [width=800 height=400 tools=['hover']]
def view2(v):
x = df[(df.zeit > r2.value[0].date()) & (df.zeit < r2.value[1].date())]
data = pd.DataFrame(x.groupby('who')['bytes'].sum())
data.sort_values(by="bytes", inplace=True)
data.reset_index(inplace=True)
display(hv.Bars(data, kdims=['who'], vdims=['bytes']))
r2 = widgets.SelectionRangeSlider(options = options, index = index, description = 'Test')
widgets.interactive(view2, v=r2)
(我已经在 github 上创建了一个滑块未正确显示标签的问题,https://github.com/jupyter-widgets/ipywidgets/issues/1759)
持续存在的问题:
图像宽度和大小在第一次更新后折叠为默认值(有没有办法将
%%opts
作为hv.Bars
的参数?)y-Scale 应保持不变(即所有更新从 0 到 150)
更新速度有没有优化的可能?
感谢您的帮助。
想出了使用 bokeh
的方法:https://github.com/bokeh/bokeh/issues/7082