Python 分层(或嵌套)多个Bokeh变换

Python 分层(或嵌套)多个Bokeh变换,python,data-visualization,bokeh,Python,Data Visualization,Bokeh,我需要动态分层(或“嵌套”)多个Bokeh变换,其中大多数是CustomJSTransforms。有什么办法吗? 是否有任何方法可以使用以下语法: Log10Transform(阈值转换(列名)) 或 LinearColorMapper(Log10Tranform(列名称)) 我目前正在使用 {'field':列名称,'transform':Log10Transform} 语法似乎不允许分层 我可以通过编写大量可怕的变换来处理纯数学变换的分层,但据我所知,我没有办法进行颜色变换(MathTran

我需要动态分层(或“嵌套”)多个Bokeh变换,其中大多数是CustomJSTransforms。有什么办法吗? 是否有任何方法可以使用以下语法:
Log10Transform(阈值转换(列名))

LinearColorMapper(Log10Tranform(列名称))

我目前正在使用
{'field':列名称,'transform':Log10Transform}
语法似乎不允许分层

我可以通过编写大量可怕的变换来处理纯数学变换的分层,但据我所知,我没有办法进行
颜色变换(MathTransform(…)


以防万一,我使用的是Bokeh v 12.5,没有升级的能力。

复合转换()逐个调用
转换:

from inspect import Signature, Parameter

def composite_transform(*transforms):
    def trans_func():
        transforms = arguments
        res = x
        for transform in transforms.values():
            res = transform.compute(res)
        return res

    def vtrans_func():
        transforms = arguments
        res = window.Array["from"](xs)
        for transform in transforms.values():
            res = transform.v_compute(res)
        return res

    parameters = [Parameter("T{:02d}".format(i), Parameter.POSITIONAL_OR_KEYWORD, default=trans) 
                      for i, trans in enumerate(transforms)]
    trans_func.__signature__ = Signature(parameters=parameters)
    vtrans_func.__signature__ = Signature(parameters=parameters)
    trans = CustomJSTransform.from_py_func(trans_func, vtrans_func)
    return trans
以下是一个例子:

进口:

import numpy as np
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource, ColorBar, CustomJS
from bokeh.models.transforms import CustomJSTransform
from bokeh.transform import transform
from bokeh.models.mappers import LinearColorMapper
from bokeh.palettes import Viridis, Category10
from bokeh.plotting import figure
from bokeh.layouts import row, column
output_notebook()
绘图:

x, y = np.random.normal(scale=0.2, size=(2, 500))
source = ColumnDataSource(data=dict(x=x, y=y))
fig = figure(plot_width=400, plot_height=300)

def dummy(source=source):
    return 0

def vtrans_value(source=source):
    data = source.data
    return [(data.x[i]**2 + data.y[i]**2)**0.5 for i in range(len(data.x))]

def vtrans_size():
    return [10 * x for x in window.Array["from"](xs)]

value_transform = CustomJSTransform.from_py_func(dummy, vtrans_value)
mult_transform = CustomJSTransform.from_py_func(dummy, vtrans_size)
cmap_transform = LinearColorMapper(Viridis[256], low=0, high=0.6)
color_transform = composite_transform(value_transform, cmap_transform)
size_transform = composite_transform(value_transform, mult_transform)

c = fig.circle("x", "y", 
               fill_color=transform("x", color_transform), 
               size=transform("x", size_transform),
               line_color=None, source=source, alpha=1)

colorbar = ColorBar(color_mapper=cmap_transform, label_standoff=12, border_line_color=None, location=(0,0))
fig.add_layout(colorbar, "right")
show(fig)
结果是:


感谢HYRY的回复。不幸的是,我无法让这个版本为我工作。以下是我的解决方案:

def CompositeTransform(*transforms):
   """Performs a series of bokeh transforms."""
   composite_transform_func = """
     res = x;
     for (i = 0; i < tlist.tags.length; i++) {
       trans = eval(tlist.tags[i]);
       res = trans.compute(res)
     }
     return res
   """

   composite_transform_v_func = """
     res = xs;
     for (i = 0; i < tlist.tags.length; i++) {
       trans = eval(tlist.tags[i]);
       res = trans.v_compute(res)
     }
     return res
   """
   arg_dict = dict([("t" + str(i), trans) for i, trans in enumerate(transforms)])
   arg_dict["tlist"] = TransformTag(
   tags=["t" + str(i) for i in range(len(transforms))])
   return CustomJSTransform(
       func=composite_transform_func,
       v_func=composite_transform_v_func,
       args=arg_dict)
def CompositeTransform(*转换):
“”“执行一系列bokeh变换。”“”
复合_变换_func=“”
res=x;
对于(i=0;i
非常感谢!这似乎很有希望。不幸的是,我一直在使用Python2.7,因此无法访问您使用的inspect函数。如果没有这些,它将失败,并出现以下javascipt错误:
Uncaught DomeException:未能在“CanvasRenderingContext2D”上执行“arc”:提供的半径(-0.0103611)为负数。
另外,您能否解释
transforms=arguments
行?为什么转换闭包失败,参数是什么?bokeh将
vtrans_func()
转换为javascript代码,
参数与Python中的
*args
相同。