テクテク日記

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

スライサーでグラフの表示・非表示

Power BIのスライサーは通常、フィルターを行う機能となります。例えば、下図のようなチャートがあるとします。

2019をクリックすると、チャートは2019年の売上でフィルターされ、下図のようになります。

ここで、以下のような少し特殊なニーズについて考えてみます。

  1. スライサーから年を選択します
  2. 選択された年を基準にグラフがハイライトされる
  3. その年を起点に全ての期間に渡って直線を表示
  4. 選択された年とその他の年を比較し、売上水準の比較を行う(例:2020年を100%とした場合、2018年は36%の水準)

今回はこのチャートの作り方について簡単に見ていきたいと思います。非常にシンプルにできますので、やり方さえ分かれば誰でも応用にまで発展させることができます。

ファイルだけが欲しい方はここからダウンロードが可能です。

初期モデル

作り方に入り前に、そもそもなぜこのようなチャートを作るのか?について少し考えてみます。

  • ちょっとカッコいいことをPower BIで実現したい
  • フィルター機能についてもっと知りたい
  • レポート利用者からリクエストされた
  • 単なる好み

いろいろ理由はあると思いますが、正直理由はどうでも良く、Power BIで

モデリングを工夫し、簡単なDAX式を使えば、可能性が広がる

というところを見て頂きたいと思います。

今回のデータは非常にシンプルで、以下のようなデータモデルとなります。

  • dCalendar
    マンスリーベースのカレンダー(Dailyにすべきというベスト・プラクティスに反することですが、デモ用なので特に問題ありません)

  • dProduct
    通常、ProductKeyでリレーションシップを組んでいますが、簡略化のためGroupのみを使用

  • Sales
    必要最小限のデータということで、Date、Group、SalesAmountの3つの列のみ用意。


    余談ですが、面白いことにPower Queryでは以下のような列順(Date > Group > SalesAmount)でしたが、データモデルに読み込まれるとGroup > SalesAmount > Date(上図)となっています。

    Power BIがデータ圧縮(インデックスの設定)を行うに際して、Group > SalesAmount > Dateという順番のほうがより効率的であると判断したためでしょう。Power BIを学び始めた頃、行や列の順番が変わっていることに非常に違和感を感じたのですが、その背景にはデータの圧縮及びメモリサイズの最適化があることを覚えておくと吉。

  • SalesAmtというメジャーを作成

モデルの変更

ここから、少しモデルを変更させていきます。

dCalendarを複製し、dCalendar_slicerというテーブルを作ります。モデルビューを開き、dCalendarとdCalendar_slicerのDate列で以下のようなリレーションシップを作ります。

リレーションシップを作る際、以下の①~⑤を同じように設定します。

  1. dCalendar_slicer
  2. dCalendar
  3. dCalendar_slicerがdCalendarをフィルターできるよう、1対多(1:*)を選択
  4. このチェックを必ず外す(非アクティブリレーションシップ)
  5. クロスフィルターの方向は単一

上記設定を必ず同じように行ってください。これで基本的な準備は全て完了しましたので、メジャーを記述していきます。

チャート用メジャー

ここから、チャート用のメジャーを作っていくのですが、まずは以下のように、dCalendar_slicerを集計しないよう、設定を変更します。

ここから以下のように、dCalendar_slicer[Year]でスライサーを作ります(※dCalendarではないことに留意)。

もう少し項目を追加し、以下のようにチャートを作ります。

ここからSalesテーブルに以下のメジャーを作ります。

このDAXメジャーを簡単に説明すると、

  • HASONEFILTERでスライサーがフィルターされているかどうかチェック
  • CALCULATEでフィルターコンテキストを変更。条件式は
    • USERELATIONSHIP関数を使って、dCalendar_Slicerがクリックされた場合、dCalendarとのリレーションシップを有効化させる(その先(Salesテーブル)へフィルターが伝播)
    • dCalendarテーブルのフィルターを外す(= 選択した年の売上が他の年にも表示される。dCalendar以外のテーブル(=dProduct)はフィルターが効く状態)
    • この2つのコンディションをベースに、[SalesAmt]メジャーを評価
  • dCalendar_slicer[Year]で年が選択された場合、[SalesAmt.Year]メジャーが計算される

となります。新たに作ったメジャーを以下のように配置。

配置した段階では何も起こりませんが、試したYearスライサーで2018を選択すると、2018年の売上が他の年にも表示されるよう、ラインが引かれます。

Group U-Zを選択してみると、ちゃんとGroupベースでフィルターできていることが分かります。

Protips:
チャートでテストする前に、テーブルでテストするのも手です。上記チャートをテーブルに変更すると、以下のようになり、分かりやすい。

ここで比較対象用のメジャーを作ります。

これをもう一度、Y軸に持っていくと、下図のように一番低い位置にラインチャートが出現します。

ラインチャートを消しつつ、値を出します。

  • 視覚化 > ビジュアル > 行 > 設定の適用先 > 系列 > Variance v Other Yearを選択
  • シェイプ > ストロークの幅を0に設定

    これで先ほどまで出ていたオレンジ色の線が消えます。
  • データラベルと値の設定を行う

    ここまで設定が済むと、先程のチャートは下のようになります。赤枠内がメジャー[Variance v Other Year]であり、2018年を100%とした場合、2019年は337%(約3.4倍)の売上規模になるという指標が現れます。

  • 選択した年度をハイライト
    このままでは、どの年を選択したか不明なので、分かりやすくするため、条件付書式で選択年度の縦棒の色を自動的に変更します。上記チャートをクリックし、可視化タブより、列 > ...(中略)、以下のように設定をしていきます。


    注意点は、最後のルールで値を1という数値に設定しておくことです。これにて完成となります。

    あとはお好みに合わせて、凡例を消したり、タイトルが自動的に変わったりするように設定していきます。

  •  ダイナミックタイトルメジャー

    上記メジャーを作ることでタイトルをダイナミックに変更させることができます。チャートを選択し、以下のように設定します。

    これで最終的にチャートは以下のように、選択されたスライサーを反映させたタイトルを表示してくれます。

最後に

今回紹介したチャートの作り方ですが、非アクティブリレーションシップを必要な時にアクティブにし、期待する結果を表示させるテクニックでした。日付ではなく、dProductテーブルでも同じように、選択したGroupを別途表示させることができますので、いろいろ応用できそうです。

念の為、ダウンロード版は2つ準備しました。データのみと最終結果の2つですが、必要に応じて使ってみてください。

>>ダウンロード