我正在用Dash-Cytoscape绘制一个网络,使用breadthfirst布局,如here所示.

我想控制元素在同一级别上的出现顺序.JS API有depthSort参数来实现这一点,但我不知道如何在Python中传递前端可以接受的回调.

我试过的东西:

  1. "depthSort": lambda a,b: a - b
  2. "depthSort": "(a,b) => a - b"
  3. "depthSort": "function (a,b) { return a - b}"

最小示例:

我想要得到这个:

   1
3     2

但我得到的是:

   1
2     3
from dash import Dash
import dash_cytoscape as cyto

app = Dash(__name__)

app.layout = cyto.Cytoscape(
    elements=[
        {"data": {"id": "1", "label": "1"}},
        {"data": {"id": "2", "label": "2"}},
        {"data": {"id": "3", "label": "3"}},
        {"data": {"source": "1", "target": "2"}},
        {"data": {"source": "1", "target": "3"}},
    ],
    layout={
        "name": "breadthfirst",
        "roots": ["1"],
        # "depthSort": ?
    },
)

app.run_server(debug=True)

推荐答案

在Python中不支持期望JS函数的选项,因为这意味着将函数作为字符串传递,因此需要Cytoscape.js来处理任意字符串,这可能是出于安全原因而不想要的.

也就是说,Dash支持clientside callbacks(JS),因此我们仍然可以在回调中分配函数:

from dash import Dash, Output, Input, State
import dash_cytoscape as cyto

app = Dash(__name__)

app.layout = cyto.Cytoscape(
    id="cyto",
    elements=[
        {"data": {"id": "1", "label": "1"}},
        {"data": {"id": "2", "label": "2"}},
        {"data": {"id": "3", "label": "3"}},
        {"data": {"source": "1", "target": "2"}},
        {"data": {"source": "1", "target": "3"}},
    ],
    layout={
        "name": "breadthfirst",
        "roots": ["1"]
    }
)

app.clientside_callback(
    """
    function (id, layout) {
        layout.depthSort = (a, b) => b.data('id') - a.data('id');
        cy.layout(layout).run();
        return layout;
    }
    """,
    Output('cyto', 'layout'),  # update the (dash) cytoscape component's layout
    Input('cyto', 'id'),       # trigger the function when the Cytoscape component loads (1)
    State('cyto', 'layout'),   # grab the layout so we can update it in the function
    prevent_initial_call=False # ensure (1) (needed if True at the app level)
)

app.run_server(debug=True)

注意:我们需要执行cy.layout(layout).run(),因为没有添加/删除任何元素,所以它不会自动运行.

Python相关问答推荐

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

韦尔福德方差与Numpy方差不同

Pandas 有条件轮班操作

切片包括面具的第一个实例在内的眼镜的最佳方法是什么?

数据抓取失败:寻求帮助

如何在solve()之后获得症状上的等式的值

OR—Tools CP SAT条件约束

numpy卷积与有效

我如何根据前一个连续数字改变一串数字?

如何在Polars中从列表中的所有 struct 中 Select 字段?

为一个组的每个子组绘制,

在pandas数据框中计算相对体积比指标,并添加指标值作为新列

为什么Python内存中的列表大小与文档不匹配?

如何将一组组合框重置回无 Select tkinter?

如何在验证文本列表时使正则表达式无序?

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

简单 torch 模型测试:ModuleNotFoundError:没有名为';Ultralytics.yolo';

我什么时候应该使用帆布和标签?

以极轴表示的行数表达式?

大型稀疏CSR二进制矩阵乘法结果中的错误