しばらく山とランは遠のいています

仕事、そしてコロナの関係でしばらく山やランからは遠ざかっています。来年の春から復帰できるようそろそろ運動再開していきたいと思います。ちなみに今、BIツールのPower BIが半分趣味になって、完全な運動不足になっています。20201020

2022年3月22日火曜日

【Power BI】円グラフ等で、「その他」を表示させる方法

 現在のPower BIでは残念ながら、上位Nのアイテムをグラフに表示させるフィルターは存在していますが、下位のアイテムをその他にまとめて表示する機能はありません。円グラフ等の割合を示すグラフではしばしばこのその他を表示させたくなります。


円グラフなどのビジュアルパーツにはその機能がないのですが、それを乗り越える方法があることを教えてもらいました。とっても面倒で、かなりの時間がかかりますが、どうしても必要な時は、以下の手順で円グラフにその他を表示させることが出来ます。一日もはやく、割合を示す円グラフや積み上げのグラフはこの機能を標準的に備えてほしいです。

0)「その他」を表示しないもともとある数値計算メジャー
_CiteScore平均_重複排除 = AVERAGEX(ALLSELECTED('MFRD_Article'[RDID-U]),[_CiteScore_重複排除])

1)「その他」を表示するためのテーブルを作成する
作成するテーブルは「その他」を加えるために新たに作成するものです。
元々あるテーブルとリレーションを張ります。その方向は単方向にして余分なフィルタがかかり、「その他」が消えないようにする。
CiteScoreMetrix_ASJCコード_親_その他表示用 = 
 UNION ( ALLNOBLANKROW ('CiteScoreMetrix_ASJCコード_親'[Description]),  { "その他" })

2)TopNの指定をするテーブルを作成する
追加するテーブルは、特別に他のテーブルとリレーション関係を持たせないようにする。複数のグラフで共通で利用することも可能。
その他表示用TopN = GENERATESERIES(2, 50, 1) 

さらに以下のメージャーをスライサ選択用に作成します。
_TopN値 = SELECTEDVALUE('その他表示用TopN'[TopN], 10)

3)「その他」がない場合のアイテム順位を設定するメジャーを作成する
_CiteScore平均順位_重複排除 = RANKX(ALLSELECTED('CiteScoreMetrix_ASJCコード_親'[Description]),[_CiteScore平均_重複排除],,,Skip)

4)「その他」がある場合のアイテム順位を設定するメジャーを作成する
_CiteScore平均順位_重複排除_その他表示 = 
    var VAL1=CALCULATE([_CiteScore平均_重複排除],ALLSELECTED('MFRD_Article'[RDID-U]))
    var VAL_RankOthers=
     RANKX(ALLSELECTED('CiteScoreMetrix_ASJCコード_親_その他表示用'[Description]),
                CALCULATE([_CiteScore平均_重複排除],ALLSELECTED('MFRD_Article'[RDID-U])),,,Skip)
    return
         IF(ISINSCOPE('CiteScoreMetrix_ASJCコード_親_その他表示用'[Description]),
         IF(SELECTEDVALUE('CiteScoreMetrix_ASJCコード_親_その他表示用'[Description])="その他",
                        'その他表示用TopN'[_TopN値]+1,
                         IF(VAL1>0,
                            IF(VAL_RankOthers>'その他表示用TopN'[_TopN値],
                                'その他表示用TopN'[_TopN値]+1,VAL_RankOthers)
                         ,BLANK())),
                         VAL1)

5)その他を表示する数値計算を行う
_CiteScore平均_重複排除_その他表示 = 
    var VAL_NoOthers=AVERAGEX(ALLSELECTED('MFRD_Article'[RDID-U]),[_CiteScore_重複排除])               return
        IF(ISINSCOPE('CiteScoreMetrix_ASJCコード_親_その他表示用'[Description]),
            var VAL1=IF([_CiteScore平均順位_重複排除_その他表示]>'その他表示用TopN'[_TopN値],
                           BLANK(),[_CiteScore平均_重複排除])
            var Table_Temp=ADDCOLUMNS(
                           ALLSELECTED('CiteScoreMetrix_ASJCコード_親_その他表示用'),
                                                 "Temp_VAL",
                                                  [_CiteScore平均_重複排除])
            var VAL_TopNTotal=SUMX(TOPN('その他表示用TopN'[_TopN値],  Table_Temp,[Temp_VAL]),                                                              [Temp_VAL])
            var VAL_ALLTotal=SUMX(Table_Temp,[Temp_VAL])
            return
                IF(SELECTEDVALUE('CiteScoreMetrix_ASJCコード_親_その他表示用'[Description])="その他",
                      VAL_ALLTotal-VAL_TopNTotal , VAL1)
         ,VAL_NoOthers)

0 件のコメント: