【问题标题】:How to do linked data selections in HoloViews with Datashader + Bokeh backend如何使用 Datashader + Bokeh 后端在 HoloViews 中进行链接数据选择
【发布时间】:2017-05-31 14:15:51
【问题描述】:

让我从补充 HoloViews 开发人员开始,这东西非常了不起。只有很多部分,很难弄清楚如何将它们放在一起做我想要的:)。

我在这里尝试进行链接的多维数据绘图,即我希望有几个绘图显示沿不同维度的相同数据的视图。然后我想利用 Bokeh 选择工具在其中一个图中选择数据,并查看它在其他图中的位置。但是我也需要使用Datashader来做,因为我的数据集很大。

这是我目前所拥有的(在 Jupyter 笔记本中运行,使用 python 2)

import numpy as np
import pandas as pd
import holoviews as hv
import holoviews.operation.datashader as hvds
hv.notebook_extension('bokeh')
%opts Scatter [tools=['box_select', 'lasso_select']] (size=10 nonselection_color='red' color='blue') Layout [shared_axes=True shared_datasource=True]

# Create some data to plot
x1 = np.arange(0,10,1e-2)
x2 = np.arange(0,10,1e-2)
X1,X2 = np.meshgrid(x1,x2)
x1 = X1.flatten()
x2 = X2.flatten()
x3 = np.sin(x1) * np.cos(x2)
x4 = x1**2 + x2**2

# Pandas dataframe object from the data 
print "Creating Pandas dataframe object"
df = pd.DataFrame.from_dict({"x1": x1, "x2": x2, "x3": x3, "x4": x4})

# Put the dataframe into a HoloViews table
dtab = hv.Table(df)

# Make some linked scatter plots using datashader
scat1 = dtab.to.scatter('x1', 'x2', [])
scat2 = dtab.to.scatter('x1', 'x3', [])
scat3 = dtab.to.scatter('x2', 'x4', [])
hvds.datashade(scat1) + hvds.datashade(scat2) + hvds.datashade(scat3)

这会产生以下内容

这非常简单。但是,它并没有完全满足我的要求。数据范围的变化和平移是联系在一起的,这很酷,但是一个图范围之外的数据仍然可以绘制在其他图上。我想让这些数据从所有绘图中消失,这样我就只能看到所有查看的数据范围内的数据,这样就可以动态地选择一些数据超立方体在多维空间中突出显示。

此外,最好让散景选择工具以相同的方式工作,例如,我可以在一个图上选择一些点,并让它们在其他图上全部显示为红色或其他东西。尽管要求“box_select”和“lasso_select”,但我什至根本没有得到选择工具。虽然我可能错误地要求它们,但我并不清楚 HoloViews 如何传递选项。

【问题讨论】:

    标签: python bokeh holoviews datashader


    【解决方案1】:

    您可以使用HoloViews Streams 选择仅使用当前可见点显示的数据。有一个例子:https://anaconda.org/petrenko/linking_datashaders

    【讨论】:

    • 哦,太好了!关于第二部分的任何想法,即仅使用数据选择而不是绘图范围?如果我正确传递工具选项,也许这会相当自动地工作。
    • 文档中的某处应该有使用数据选择的示例,但如果您没有看到,请在gitter channel 上询问。
    【解决方案2】:

    根据 James 的回答 (https://stackoverflow.com/a/44288019/1447953),我将问题中的示例扩展到以下内容。它将一个图作为“主”控制源,并且仅将出现在该图数据范围内的数据绘制到一堆“从”图上。拥有双向关系会很好,但这很酷。

    import numpy as np
    import pandas as pd
    import holoviews as hv
    import holoviews.operation.datashader as hvds
    hv.notebook_extension('bokeh')
    %opts Layout [shared_axes=False shared_datasource=True]
    
    # Create some data to plot
    x1 = np.arange(0,10,1e-2)
    x2 = np.arange(0,10,1e-2)
    X1,X2 = np.meshgrid(x1,x2)
    x1 = X1.flatten()
    x2 = X2.flatten()
    x3 = np.sin(x1) * np.cos(x2)
    x4 = x1**2 + x2**2
    
    # Pandas dataframe object from the data 
    print "Creating Pandas dataframe object"
    df = pd.DataFrame.from_dict({"x1": x1, "x2": x2, "x3": x3, "x4": x4})
    
    # Make some linked scatter plots using datashader
    x1_x2 = hv.Points(df[['x1', 'x2']])
    #x1_x3 = hv.Points(df[['x1', 'x3']])
    #x2_x4 = hv.Points(df[['x2', 'x4']])
    
    from holoviews import streams
    
    maindata=x1_x2
    mainx='x1'
    mainy='x2'
    def create_dynamic_map(xvar,yvar):
        def link_function(x_range, y_range):
            x_min = x_range[0]; x_max = x_range[1]
            y_min = y_range[0]; y_max = y_range[1]
            pts = hv.Points(df[  (getattr(df,mainx) > x_min) & (getattr(df,mainx) < x_max) 
                               & (getattr(df,mainy) > y_min) & (getattr(df,mainy) < y_max) 
                              ][[xvar, yvar]])
            return pts
        dmap = hv.DynamicMap(link_function, 
                         streams=[hv.streams.RangeXY(x_range=(-100,100), 
                                                     y_range=(-100,100), 
                                                     source=maindata)],
                         kdims=[])
        return dmap
    
    x1_x3 = create_dynamic_map('x1','x3')
    x2_x4 = create_dynamic_map('x2','x4')
    
    hvds.datashade(x1_x2) + hvds.datashade(x1_x3) + hvds.datashade(x2_x4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      相关资源
      最近更新 更多