【Power BI】数値の差を強調するダンベルチャートをデフォルトビジュアルで表現する

ダンベルチャートとは

2つの値の比較を可視化するチャートで、Tableauでは一般的な表現方法のようです。 目標と結果をならべて表示するよりも、2つの値の差として表現する。カテゴリごとに並べることで、2つの値のトレンドを把握することができる。

Power BI での表現と参考Youtube

Power BI のデフォルトビジュアル「折れ線グラフ」だけで表現する。外部ビジュアルのインポートが不要です。 DAX の考え方や順序だてて理解するには、How to Power BI を参考にする。

www.youtube.com

準備

Power BI のサンプルデータセットを利用する。 目標と実績のデータはふくまれていないので、便宜的に[Profit] と [Discount] の合計値を比較として採用する。

比較対象のDAX

Total Discout = 
SUM(financials[Discounts])
Total Profit = 
SUM(financials[Profit])

DAX / テーブル

ダンベルチャートの折れ線グラフのX軸を定義するテーブル「」

新しいテーブルから作成: それぞれの値から動的に軸の範囲を決定する。 DAX式は最終的な完成形なので、最初はパラメータから使用する。

パラメータからXAxisテーブルを作成

XAxis = 
GENERATESERIES(
    ROUND(
        MINX(ALLSELECTED( financials[Product] ),
        MIN( [Total Discout] , [Total Profit] )
        ) / 100000 , 0
    ) - 1,
    ROUND(
        MAXX(ALLSELECTED( financials[Product] ),
        MAX( [Total Discout] , [Total Profit] )
        ) / 100000 , 0
    ) +1,
    
    1
)

2つの値と、それらをつなぐ線をあらわすDAX

Dot - Total Discount:
Dot - Total Discount = 
IF(
    SELECTEDVALUE('XAxis'[Xasis]) = ROUND([Total Discout]/100000 , 0),
    1
)
Dot - Total Profit:
Dot - Total Profit = 
IF(
    SELECTEDVALUE('XAxis'[Xasis]) = ROUND([Total Profit]/100000 , 0),
    1
)
Range - Discount to Profit:

2つのDotをつなぐ線のDAX

Range - Discount to Profit = 
VAR _Min =
MIN( 
    ROUND( [Total Discout] / 100000 , 0), ROUND( [Total Profit] /100000 , 0)
)

VAR _Max =
MAX( 
    ROUND( [Total Discout] / 100000 , 0), ROUND( [Total Profit] /100000 , 0)
)

VAR _Range =
IF(
    SELECTEDVALUE( XAxis[Xasis] ) >= _Min
    && SELECTEDVALUE( XAxis[Xasis] ) <= _Max,
    1
)
RETURN
    _Range

\

ビジュアル補助のためのDAX

Labesl Total Profit:
Labesl Total Profit = 
FORMAT( [Total Profit] , "#,##0,,0")
Labesl Total Discount:
Labesl Total Discount = 
FORMAT( [Total Discout] , "#,##0,,0")
YAxis Labels:

カテゴリをタイトルの代わりに表示するためのラベル

YAxis Labels = 
SELECTEDVALUE( financials[Product])
YAxis Item Label Placeholders:

ラベルを「X軸の左端」に配置するための位置DAX

YAxis Item Label Placeholders = 
VAR _Min =
MINX(
    ALLSELECTED( financials[Product] ),
    MIN( ROUND( [Total Discout] / 100000 , 0), ROUND( [CF Total Profit] /100000 , 0)
    )
)
VAR _Label_PlaceHolder =
IF(
    SELECTEDVALUE( XAxis[Xasis] ) = _Min -10,
    1
)
RETURN
    _Label_PlaceHolder

完成

DAXを折れ線グラフに放り込む

ビジュアルを整える

完成キャプチャ