史上第一份基於DAX數據模型編寫的美國人口遷徙地圖
今天向大家分享一則基於power pivot數據模型的複雜數據地圖.
此則地圖表達的是人口的遷徙,紅色圓邊框紅表示Leaving.如果點擊切片器上的Leaving,只在在地圖上紅色圓邊框紅.紅色圓點表示為Arriving.,如果點擊切片器上的Arriving,只能看到圓點,選擇Net,表示為凈值,紅色邊框線與紅色圓點也就都能看到了.點擊不同的城市,圖中的氣泡能隨著地圖上的放射線移動,
畫完這張地圖,心裡特別高興,居然用DAX公式編寫出來了複雜的數據地圖.用DAX公式編寫地圖的優點就是數據點的坐標值都是放在維度表上的,因此事實表上的數據更新到幾百萬行,依然還可以使用.更重要的一點是,公式由於處於DAX數據模型層面編寫的,可以更自由的做複雜篩選,增加更多的數據切片.缺點就是比工作表函數要更難理解與編寫, 難的原因有很多,重要的一條就是普通excel用戶早已習慣了excel的函數工作原理,它的工作原理就是通過橫坐標,縱坐標確定單元格的位置來進行編寫函數公式,,而power pivot是一個數據倉庫,它的數據存儲方式與公式的編寫更像資料庫,.如果你沒有學習過一點關於DAX數據建模的知識,恐怕我下面寫的文字,會有點不知所云..
製圖原理:
從製圖原理上,是兩張圖表疊加在一起,一張用來做氣泡圖,別一張繪製帶點的散點圖,形成射線狀.
如圖是泡泡圖的數據源,副Y,副X是城市的坐標軸,切片器選擇Teaving,左邊Arr列一律為0,選擇Arriving,右邊的Arr列一律為0,選擇Net,兩列數據同是不為0.於是在圖表上呈現不同的效果.
再用另外的帶點的散點圖構造放射性線條.
觀察數據,會發現城市是有規律的錯行,於是以出發城市Wisconsin為起點向各個城市呈現放射狀的線條.
公式編寫:
製圖原理大概清楚了,剩下的就是公式的編寫與模型的構造,這也是最難的.
如上圖所示,是標準的一維數據,有一萬多行,每一行數據表達了兩個城市人口遷徙的關係,狀態為Arriving表示到達.,Leaving表示離開
為了獲取兩個城市之間的坐標,必須再另外構造兩個城市坐標的維度表.
兩個維度表的數據是一模一樣的,只是出發地城市坐標這張表的satae計算列的關係線對應數據源的出發地計算列,,而目的地城市坐標這張表的的satae計算列的關係線對應數據源的到達地計算列.別外一張表切片器,不需要關係,是到時用來做切片選擇的.
由於兩個城市列的對應該坐標值是數值類型,放入透視表值區域會自動進行求和,這樣的坐標數據肯定是錯誤的,不需要.如何防止?那必須寫如下公式:
X坐標:=MINX(TOPN(1,數據源,[出發地],DESC),RELATED(出發地城市坐標[lng]))
用TOPN函數可以有效的防止坐標軸在放入值區域時進行累加求和.再嵌套MINX迭代函數只取坐標軸這一列數據.
同樣的公式,用來獲取出發地的Y坐標,以及到達地這列的XY坐標
Y坐標:=MINX(TOPN(1,數據源,[出發地],DESC),RELATED(出發地城市坐標[lat]))
副X:=MINX(TOPN(1,數據源,[出發地],DESC),RELATED(目的地城市坐標[lng]))
副Y:=MINX(TOPN(1,數據源,[出發地],DESC),RELATED(目的地城市坐標[lat]))
依然用相同的公式用來獲取對應的城市名字,這樣就可以將文本類型的城市名字放進數據透視表的值區域.
出發city:=MINX(TOPN(1,數據源,[出發地],DESC),[出發地])
無論數據怎麼改變,永遠取最大的數值,這個數值將來是用於固定氣泡的大小,公式簡單.
最大值:=CALCULATE(max(數據源[數值]),ALL(數據源))
作用於切片器
, 的公式,
度量值 1:=if(HASONEVALUE(切片器[狀態選擇]),CALCULATE(SUM(數據源[數值]),數據源[狀態]=VALUES(切片器[狀態選擇])),0)
HANONEVALUE是典型的作用於切片器選擇的函數,當切片器選擇一個數值時,返回trun,選擇多個返回false..這個公式用來過渡的,為了構造如下兩個公式的一個子變數.
Arr:=if(CALCULATE(SUM(數據源[數值]),數據源[狀態]="Arriving")=[度量值 1]||VALUES(切片器[狀態選擇])="Net",CALCULATE(SUM(數據源[數值]),數據源[狀態]="Arriving"),0)
Leav:=if(CALCULATE(SUM(數據源[數值]),數據源[狀態]="Leaving")=[度量值 1]||VALUES(切片器[狀態選擇])="Net",CALCULATE(SUM(數據源[數值]),數據源[狀態]="Leaving"),0)
兩個公式比較費腦,完全是作用於切片器的,當切片器選擇為Arriving或Net時,Arr欄位在透視表中就呈現城市對應的數值,否則返回0,.或者當切片器選擇為Leaving或Net時,Leav欄位就在透視表中呈現城市對應的數值否則返回0.
用來獲取兩個城市數值間的差值.比如從A城市到達B城市的人口數值是15,從A城市離開到達B城市的人口數值是20,那差值無非是20-15=5.但在power pivot里很難進行這樣的簡單運算,它是標準的資料庫存儲的形式,是兩行不同的信息,很難並排放在一行進行計算.所以下面這個公式就同樣非常費腦了,構造一個虛擬表,將兩行不同的信息放在同一行進行相減.
差值:=MINX(ADDCOLUMNS(VALUES(數據源[合併]),"差值1",CALCULATE(SUM(數據源[數值]),數據源[狀態]="Arriving")-CALCULATE(SUM(數據源[數值]),數據源[狀態]="Leaving")),[差值1])
上面公式寫完,只要拖放進數據透視表,已經差不多可以正常出圖.最後將一張美國地圖放在圖表的最底層就可以了.只是射線地圖還有一點缺失,必須稍微利用一下工作表函數.以後想辦法彌補.具體的內容可以參考原文件. 估計是世界上第一份基於power pivot數據模型弄出來的複雜散點地圖圖表.編寫DAX公式的靈感來自於劉凱老師
,作圖思路來自於劉萬祥老師 .在此致謝!
DAX表達式編輯了一份中國地圖
推薦閱讀:
※華爾街圖表點圖與堆積組合
※把數據標籤「掛」在柱形圖的外側,逼格滿滿!
※3個Excel神技巧,免費教你
※PowerBI 公式 - 排名 RankX和TopN
※預算模式----DAX學習筆記
TAG:MicrosoftExcel | PowerBI |