本文内容
Plotly 图形库支持大约 80 种图表类型,它们对于高级图表非常有用,包括地理、科学、机器学习、3D、动画和其他许多图表类型。 有关详细信息,请参阅 Plotly。
若要以 Kusto 查询语言呈现 Plotly 视觉对象,查询必须生成一个表,其中的单个字符串单元格包含 Plotly JSON。 可通过以下两种方法之一生成此 Plotly JSON 字符串:
在此方法中,你在 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 图形库支持大约 80 种图表类型,包括基本图表、科学、统计、金融、地图、3D、动画等等。 若要以 KQL 呈现 Plotly 视觉对象,查询必须生成一个表,其中的单个字符串单元格包含 Plotly JSON。
由于 python 在此服务中不可用,因此请使用预先准备的模板创建此 Plotly JSON。
在此方法中,可以重用用于特定可视化效果的预先准备好的 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