从 Python Holoviews / Datashader 检索点击数据
Retrieve click data from Python Holoviews / Datashader
我来自 Python-Dash 试图通过使用第一个图形的点击数据创建第二个图形来实现交互式图形功能。类似的可以查到here
我一直在检索并正确使用点击数据来创建第二个图表。
这是我试过的方法:
import numpy as np
import pandas as pd
import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
from holoviews import streams
import panel as pn
import datashader as ds
hv.extension("bokeh")
packages=[np,pd, hv, pn, ds]
for i in packages: print(i.__name__, i.__version__)
#dummy data
N=1200
np.random.seed(123)
df = pd.DataFrame({
'date': np.arange(0,N,1),
'product' : [np.random.choice(['A', 'B']) for i in range(N)],
'quantity' : np.random.randint(1,10,N),
'price' : np.random.randint(50,100,N),
})
df.head(2)
def clicked_point(x, y):
return pn.pane.Str('Click at %0.2f, %0.2f' % (x, y), width=200)
kdims = ['date', 'quantity']
vdims = ['product', 'quantity']
points = hv.Points(df, kdims, vdims)
shaded = datashade(points)
spreaded = dynspread(shaded)
plot = spreaded.opts(tools=['hover','tap'])
stream = hv.streams.Tap(source=spreaded, x=np.nan, y=np.nan)
layout = pn.Row(plot, pn.bind(clicked_point, x=stream.param.x, y=stream.param.y))
layout
问题是我不清楚如何使用打印在图表右侧的点击数据 and/or 工具提示中可用的数据,例如,返回原始数据框并对其进行过滤基于这些值。如果能做这样的事情就好了:
df2=df.loc[(df['date']==clicked_date) & (df['quantity']==clicked_quantity) ]
对于这方面的任何建议,我将不胜感激。
最佳,
dll
基本上,这需要创建一个函数来根据点击数据过滤数据 在全息视图中创建一个流对象来捕获事件数据,然后将它们放在一起 table。请注意,可能有多种方法可以将 x-y 坐标近似为数据中的实际点。例如,在这种情况下,我只是将 x 和 y 坐标四舍五入:
def click_table(x,y):
if x is None or y is None:
df2=[]
else:
df2=table[round(x,0) , round(y,0)]
return df2
stream = hv.streams.Tap(source=spreaded, x=np.nan, y=np.nan)
layout = pn.Row(plot,
pn.bind(clicked_point, x=stream.param.x, y=stream.param.y),
pn.bind(click_table, x=stream.param.x, y=stream.param.y)
)
layout
我来自 Python-Dash 试图通过使用第一个图形的点击数据创建第二个图形来实现交互式图形功能。类似的可以查到here
我一直在检索并正确使用点击数据来创建第二个图表。
这是我试过的方法:
import numpy as np
import pandas as pd
import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
from holoviews import streams
import panel as pn
import datashader as ds
hv.extension("bokeh")
packages=[np,pd, hv, pn, ds]
for i in packages: print(i.__name__, i.__version__)
#dummy data
N=1200
np.random.seed(123)
df = pd.DataFrame({
'date': np.arange(0,N,1),
'product' : [np.random.choice(['A', 'B']) for i in range(N)],
'quantity' : np.random.randint(1,10,N),
'price' : np.random.randint(50,100,N),
})
df.head(2)
def clicked_point(x, y):
return pn.pane.Str('Click at %0.2f, %0.2f' % (x, y), width=200)
kdims = ['date', 'quantity']
vdims = ['product', 'quantity']
points = hv.Points(df, kdims, vdims)
shaded = datashade(points)
spreaded = dynspread(shaded)
plot = spreaded.opts(tools=['hover','tap'])
stream = hv.streams.Tap(source=spreaded, x=np.nan, y=np.nan)
layout = pn.Row(plot, pn.bind(clicked_point, x=stream.param.x, y=stream.param.y))
layout
问题是我不清楚如何使用打印在图表右侧的点击数据 and/or 工具提示中可用的数据,例如,返回原始数据框并对其进行过滤基于这些值。如果能做这样的事情就好了:
df2=df.loc[(df['date']==clicked_date) & (df['quantity']==clicked_quantity) ]
对于这方面的任何建议,我将不胜感激。
最佳,
dll
基本上,这需要创建一个函数来根据点击数据过滤数据 在全息视图中创建一个流对象来捕获事件数据,然后将它们放在一起 table。请注意,可能有多种方法可以将 x-y 坐标近似为数据中的实际点。例如,在这种情况下,我只是将 x 和 y 坐标四舍五入:
def click_table(x,y):
if x is None or y is None:
df2=[]
else:
df2=table[round(x,0) , round(y,0)]
return df2
stream = hv.streams.Tap(source=spreaded, x=np.nan, y=np.nan)
layout = pn.Row(plot,
pn.bind(clicked_point, x=stream.param.x, y=stream.param.y),
pn.bind(click_table, x=stream.param.x, y=stream.param.y)
)
layout