Plotly(预览版)

适用于:✅Azure 数据资源管理器Azure MonitorMicrosoft Sentinel

Plotly 图形库支持大约 80 种图表类型,它们对于高级图表非常有用,包括地理、科学、机器学习、3D、动画和其他许多图表类型。 有关详细信息,请参阅 Plotly

若要以 Kusto 查询语言呈现 Plotly 视觉对象,查询必须生成一个表,其中的单个字符串单元格包含 Plotly JSON。 可通过以下两种方法之一生成此 Plotly JSON 字符串:

在 Python 中编写自己的 Plotly 可视化效果

在此方法中,你在 Python 中使用 Plotly 包动态创建 Plotly JSON 字符串。 此过程需要使用 python() 插件。 Python 脚本使用内联 python() 插件在现有节点上运行。 它生成由客户端应用程序呈现的 Plotly JSON。

使用此方法时,支持所有类型的 Plotly 可视化效果。

注意

为获得最佳性能,请确保 python 插件映像包含最新版本的 Python 引擎(当前为 3.10.8)。 可以使用 get_packages_version_fl() 函数进行此检查。 若要升级 Python 映像,请参阅更改群集上的 Python 语言扩展映像

示例

以下 KQL 查询使用内联 Python 创建 3D 散点图:

OccupancyDetection
| project Temperature, Humidity, CO2, Occupancy
| where rand() < 0.1
| evaluate python(typeof(plotly:string),
```if 1:
    import plotly.express as px
    fig = px.scatter_3d(df, x='Temperature', y='Humidity', z='CO2', color='Occupancy')
    fig.update_layout(title=dict(text="Occupancy detection, plotly 5.11.0"))
    plotly_obj = fig.to_json()
    result = pd.DataFrame(data = [plotly_obj], columns = ["plotly"])
```)

plotly 视觉对象类型的屏幕截图。

Plotly 图形库支持大约 80 种图表类型,包括基本图表、科学、统计、金融、地图、3D、动画等等。 若要以 KQL 呈现 Plotly 视觉对象,查询必须生成一个表,其中的单个字符串单元格包含 Plotly JSON

由于 python 在此服务中不可用,因此请使用预先准备的模板创建此 Plotly JSON。

使用预先准备的 Plotly 模板

在此方法中,可以重用用于特定可视化效果的预先准备好的 Plotly JSON,只需将数据对象替换为要呈现的所需数据即可。 可以将模板存储在标准表中,并且可以将数据替换逻辑打包到存储函数中。

目前,受支持的模板有:plotly_anomaly_fl()plotly_scatter3d_fl()。 有关语法和用法,请参阅以下文档。

示例

let plotly_scatter3d_fl=(tbl:(*), x_col:string, y_col:string, z_col:string, aggr_col:string='', chart_title:string='3D Scatter chart')
{
    let scatter3d_chart = toscalar(PlotlyTemplate | where name == "scatter3d" | project plotly);
    let tbl_ex = tbl | extend _x = column_ifexists(x_col, 0.0), _y = column_ifexists(y_col, 0.0), _z = column_ifexists(z_col, 0.0), _aggr = column_ifexists(aggr_col, 'ALL');
    tbl_ex
    | serialize 
    | summarize _x=pack_array(make_list(_x)), _y=pack_array(make_list(_y)), _z=pack_array(make_list(_z)) by _aggr
    | summarize _aggr=make_list(_aggr), _x=make_list(_x), _y=make_list(_y), _z=make_list(_z)
    | extend plotly = scatter3d_chart
    | extend plotly=replace_string(plotly, '$CLASS1$', tostring(_aggr[0]))
    | extend plotly=replace_string(plotly, '$CLASS2$', tostring(_aggr[1]))
    | extend plotly=replace_string(plotly, '$CLASS3$', tostring(_aggr[2]))
    | extend plotly=replace_string(plotly, '$X_NAME$', x_col)
    | extend plotly=replace_string(plotly, '$Y_NAME$', y_col)
    | extend plotly=replace_string(plotly, '$Z_NAME$', z_col)
    | extend plotly=replace_string(plotly, '$CLASS1_X$', tostring(_x[0]))
    | extend plotly=replace_string(plotly, '$CLASS1_Y$', tostring(_y[0]))
    | extend plotly=replace_string(plotly, '$CLASS1_Z$', tostring(_z[0]))
    | extend plotly=replace_string(plotly, '$CLASS2_X$', tostring(_x[1]))
    | extend plotly=replace_string(plotly, '$CLASS2_Y$', tostring(_y[1]))
    | extend plotly=replace_string(plotly, '$CLASS2_Z$', tostring(_z[1]))
    | extend plotly=replace_string(plotly, '$CLASS3_X$', tostring(_x[2]))
    | extend plotly=replace_string(plotly, '$CLASS3_Y$', tostring(_y[2]))
    | extend plotly=replace_string(plotly, '$CLASS3_Z$', tostring(_z[2]))
    | extend plotly=replace_string(plotly, '$TITLE$', chart_title)
    | project plotly
};
Iris
| invoke plotly_scatter3d_fl(x_col='SepalLength', y_col='PetalLength', z_col='SepalWidth', aggr_col='Class', chart_title='3D scatter chart using plotly_scatter3d_fl()')
| render plotly

plotly 示例输出的屏幕截图。