次の方法で共有


プロット (プレビュー)

適用対象: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Plotly グラフィックス ライブラリでは、地理、科学、機械学習、3D、アニメーション、その他多くのグラフの種類など、高度なグラフ作成に役立つ最大 80 種類のグラフがサポートされています。 詳細については、「Plotly」を参照してください。

Kusto クエリ言語で Plotly ビジュアルをレンダリングするには、クエリで Plotly JSON を含む単一の文字列セル含むテーブルを生成する必要があります。 この Plotly JSON 文字列は、次の 2 つの方法のいずれかで生成できます。

Python で独自の Plotly 視覚化を作成する

このメソッドでは、Plotly パッケージを使用して、Python で Plotly JSON 文字列を動的に作成します。 このプロセスでは、python() プラグインを使用する必要があります。 Python スクリプトは、インライン python() プラグインを使用して既存のノードで実行されます。 クライアント アプリケーションによってレンダリングされる Plotly JSON が生成されます。

すべての種類の Plotly 視覚化がサポートされています。

手記

最適なパフォーマンスを得るために、Python プラグイン イメージに最新バージョンの Python エンジン (現在 3.10.8) が含まれていることを確認します。 get_packages_version_fl() 関数で最新バージョンを確認します。 Python イメージをアップグレードするには、「クラスターで Python 言語拡張機能イメージを変更する」を参照してください。

次のクエリでは、インライン 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 グラフィックス ライブラリでは、基本的なグラフ、科学、統計、財務、マップ、3D、アニメーションなど、最大 80 種類のグラフがサポートされています。 KQL で Plotly ビジュアルをレンダリングするには、クエリで Plotly JSON を含む 1 つの文字列セルを含むテーブル生成する必要があります。

このサービスでは 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

プロットされた例の出力のスクリーンショット。