テクテク日記

テクテク=>テクノロジー&一歩ずつ(テクテク)

期間ハイライトチャート

お客さんからの質問で、Power BIで選択した期間をハイライトするやり方を紹介します。マーケティングキャンペーンや限定的にある期間を強調したい場合に使えるテクニックですが、DAXとチャートの設定を行うことで実現できます。

※ 説明が不要な方は一番下にpbixファイルを置いておきましたので、ダウンロードして使ってみてください

シナリオ

シナリオとして、時系列チャートで選んだ期間をハイライトさせることですが、前準備として下のようなシンプルなデータモデルを作ります。

非常にシンプルなモデルで、dCalendar(日付テーブル)とSales(売上ファクトテーブル)、そしてdEvent(キャンペーン用テーブル、リレーションシップなし)の3つで構成されています。モデルが完成した後、Power BI Desktop上でSalesAmtというベースメジャーを作ります。

----------------------
-- Measure: [SalesAmt]
----------------------
MEASURE Sales[SalesAmt] = SUM( Sales[SalesAmount] )
    FormatString = "#,0"

ここから、以下3つのビジュアルを作り、前準備を終えます。

  • 積み上げ(コンボ)チャート
  • 面グラグ(別名:エリアチャート)

  • ラインチャート

DAX式

ここから冒頭の紹介動画でのハイライト区分のロジックについて紹介していきます。選択した期間を部分的にハイライトする機能はPower BI Desktopに搭載されいないので、これを実現するためにはDAXとビジュアルの設定を変更する必要があります。

動画では4種類のチャートを紹介していますが、基本的な考え方は以下の通りです。

  • 左下の「エリアチャート内部」を除き、ハイライトを実現するために第2軸(Y軸)を使用
  • 期間(X軸)がキャンペーン期間に該当した場合、1という結果を返す
  • 1を返すようなメジャー(今回はRangeFlagという名前)を構築
  • (左下の)「エリアチャート内部」のチャートだけ、SalesAmt.SelectedPeriodという売上メジャーを別途構築
  • これらのメジャーを使ってグラフの設定を行い、上記ビジュアルを実現

メジャー:RangeFlag

-----------------------
-- Measure: [RangeFlag]
-----------------------
MEASURE Sales[RangeFlag]
    IF(
        HASONEVALUE( dEvent[施策] ),        //1つの施策が選ばれた時のみ、ハイライトを施す
        var _period =                     //施策期間を抽出
            FILTER(
                ALL( dCalendar[Date] ),
                var _start = MAX( dEvent[Start] )
                var _end = MAX( dEvent[End] )
                return
                dCalendar[Date] >= _start &&
                dCalendar[Date] <= _end
            )
        var _result =                     
            CALCULATE(
                COUNTROWS( Sales ),
                //COUNTROWSをSUMX(VALUES(dCalendar[Date]), 1)でもOK
                KEEPFILTERS( _period )
            )
        return 
            IF( _result > 0, 1 )
            //期間内であれば必ず1以上になるため、1を算出し、それ以外はBLANKを返す
    )
    FormatString = "0"

このメジャーにはいくつかステップがあるのですが、上記のような書き方で以下のような結果が得られます。

同様に、もう一つのメジャーも作ります。

メジャー:SalesAmt.SelectedPeriod

-------------------------------------
-- Measure: [SalesAmt.SelectedPeriod]
-------------------------------------
MEASURE Sales[SalesAmt.SelectedPeriod]
    IF(
        HASONEVALUE( dEvent[施策] ),
        var _period = 
            FILTER(
                ALL( dCalendar[Date] ),
                var _start = MAX( dEvent[Start] )
                var _end = MAX( dEvent[End] )
                return
                dCalendar[Date] >= _start &&
                dCalendar[Date] <= _end
            )
        var _result = 
        CALCULATE(
            [SalesAmt],
            KEEPFILTERS( _period )
        )
        return _result
    )
    FormatString = "#,0"

変わっている部分は_resultという変数の中身であり、先ほどは1 or 空白を算出していましたが、今回は該当する期間における売上高を算出しています(下図)。

これでほぼ完成ですが、最後はこれらをチャートに反映させていきます。

ビジュアルの調整

積み上げチャート

以下のビジュアルをまず作ります。

スライサーとテーブルを追加します。

チャートを選択し、以下のようにRangeFlagを追加します。

DAXで定義した通り、施策が何も選ばれていない状態では何も起こらず、施策のどれかをクリックすると、選択した施策の期間に渡って、第2軸(線のY軸)に1という値が出現します。

ここから、以下の操作を行います。

  1. 凡例を消す
    凡例に、RangeFlagが出現しているため、これをOFFに

  2. X軸やY軸のタイトルを変更、OFFに

  3. ビジュアル > 第2Y軸 > 範囲(最小値・最大値)を0と1に変更し、最後に第2Y軸をOFF

    すると、現時点のグラフの見え方は以下のようになります。先ほどとは違い、RangeFlagに該当する直線が上のほうに上がってきした。

  4. ビジュアル > シェイプ > ストロークの幅(3から0へ)と色(網掛け領域)をONにする

  5. これで完成

あとはチャートのタイトルが「Dateによる・・」となっていますので、こちらも適宜修正し、ハイライトの色等については、上図のRangeFlagの色濃さ等を調整すればOKです。

エリアチャート

同じ要領でエリアチャートを作って同じ手順をたどると下図のようになります。

ただし、設定の部分がコンボチャートと微妙に違っていることに留意が必要です。

エリアチャート内部

一方、エリアチャート内部について、期間全体ではなく、売上高そのものをハイライトしています(下図)。

これは、SalesAmt.SelectedPeriodメジャーを使用することで簡単に作れますので、以下の手順に従います。

  1. エリアチャートを作ります
    上記のコンボチャートを複製し、コンボチャートからエリアチャートに変更。ついでにRangeFlagメジャーを削除すると以下のエリアチャートが出来上がります

  2. この状態でSalesAmt.SelectedPeriodをY軸に追加すると、ハイライトが表示されます

ラインチャート

最後にラインチャートですが、こちらは調整がやや面倒なので留意が必要です。

  • 単純なラインチャートではハイライトを作ることができないため、コンボチャートを使用

  • コンボチャートでは第2Y軸がラインチャートになるため、ラインチャートを売上として表示させたい場合、第2Y軸(線のY軸)にSalesAmt、列のY軸にRangeFlagに変更します(先ほどのコンボチャートを再利用)

  • 第2Y軸は先ほどの設定で「範囲」が最小値 = 0、最大値 = 1になっていたため、こちらを元に戻す。すると、チャートの見た目は凡そ下図のようになります(※ 左側の値がマックス1になっているところに注意)

  • この状態でエリアチャートをラインチャートに変更。設定でストロークを2に変更し、網掛け領域をOFFに

  •  ラインチャートによるハイライトがほぼ出来上がりました

    ただし、このままの状態では左側に売上高というタイトルが残っていることや、左側Y軸の0.5や1が表示されてしまうため、これらを非表示にし、右側のタイトルに売上高を持っていきます。最終的にはハイライト部分として機能する積み上げチャートのカラーも変更してあげます(下図)

    ちなみに、最後のこちらのチャートだけ、仮に途中で売上がない日が続いた場合、ハイライブ部分は下記のように欠けてしまいますので、注意が必要です(他のチャートは問題なし)。

おまけ

これで全種類のチャートを作ることができましたが、最後のラインチャートがどうしても気になる方は、「エリアチャート内部」の作り方を参考にラインチャートを選択して以下のような、ラインチャートの一部だけが別の色でハイライトされたチャートを作ることもできます。

詳細は割愛しますが、気になる方は下記pbixファイルをダウンロードして確認してみて下さい。

今回使用したファイル(ダウンロード)