MATLAB Graph Object(3): 展示關係網

老闆:myc你還想不想轉正了??

myc:我只是去過五一長假了而已……

老闆:騙鬼呢?五一早就不放7天了好嗎,App Designer都快寫完了,你不想轉正人家就要上位了

myc:人家已經是老員工了……

老闆:再不寫就開除

myc:……

myc這就把他嘔心瀝血的難產產物獻給大家……

我們在上一篇講Graph的文章中生成了一個專欄462名關注者的關係圖。然而有句古話說的好

Code is cheap, show me the plot.

好在MATLAB新的Graph類自帶了plot的函數

h = plot(subsG);n

這就是我們462個關注者及每個關注者的關注者的關係圖。在人際關係圖中,force graph更能體現出每個節點的重要性。我們來改變當前圖的結構

h.layout(force)n

放大看看是不是好一點?

並沒有……主要是數據太多,都烏壓壓地在一起了。這裡有5萬多個節點,肯定看起來不方便。我們回到數據,想想最重要的是什麼?

不就是我們專欄忠實的關注者嗎?

於是我們取出這462位關注者,建立子圖。在MATLAB中可以很方便的用subgraph功能從圖中剝離出子圖。

realFollower = subsG.findnode(ids);nfollowerGraph = subgraph(subsG,realFollower)nfollowerGraph = nn digraph with properties:nn Edges: [990×1 table]n Nodes: [462×3 table]nnhsub = plot(followerGraph,layout,force)n

現在再來看看這462位關注者之間的關係,是不是比之前的清晰很多?

然而我們還可以做的更好。

我們的數據是多維的,比如每個關注者有自己的粉絲,如何在一個2維的圖上顯示出這個信息呢?

我們可以用每個節點的大小來代表他/她的粉絲數

hsub.MarkerSize = log(str2double(followerGraph.Nodes.Weight)+1.1)*2;n

看起來不錯,如果同時把節點的顏色變成他/她的粉絲數呢?

hsub.NodeCData=str2double(followerGraph.Nodes.Weight);n

瞬間變的清晰明了了有沒有?突出一個大V

然而myc很快的意識到,粉絲數的多少對於專欄來說並沒有什麼大用。倒是一個關注者在專欄內有多少個其他關注者粉絲是個很有意思的數據。我們用圖的入度indegree來表示一個節點有多少個粉絲。

hsub.NodeCData=indegree(followerGraph);n

我們可以看到,之前的大V節點在專欄內其實並不是有最多「朋友」的。當然本來粉絲就少的關注者在專欄內也不會有很多粉絲。

我們來看看到底是誰在專欄內有最多的關注者。我們進入datacursor模式。點擊最黃的那個節點

hd = datacursormode;n

在專欄內有93個粉絲喲,幾乎佔了462人的20%。很大程度上可以說有20%的人都是因為他/她而關注MATLAB專欄的。

但是默認的datatip給出的信息太生肉了,還帶著那個不是給人看的id。我們來寫一個自己的顯示datatip的方式

hd.UpdateFcn = @(obj,event_obj) GraphCursorCallback(obj,event_obj,followerGraph);n

在回調函數中,顯示當前節點的名字,粉絲數,和專欄中的粉絲數

function output_txt = GraphCursorCallback(obj,event_obj,g)n% Display the position of the data cursorn% obj Currently not used (empty)n% event_obj Handle to event objectn% output_txt Data cursor text (character vector or cell array of character vectors).nnh = get(event_obj,Target);npos = get(event_obj,Position);nind = find(h.XData == pos(1) & h.YData == pos(2), 1);nnoutput_txt = {g.Nodes.uName{ind},[Follower ,g.Nodes.Weight{ind}],[Friend in subscriber ,num2str(indegree(g,ind))]};nendn

再點擊那個節點看看,原來是@李崇 ,他自己有1000+的粉絲,在專欄中有93個粉絲,說明他粉絲中至少10%的人是和他在MATLAB上有交集的(大概

MATLAB的GraphPlot類還提供了方便的高亮功能,比如我們想看我們的第一位關注者@Yu Jiang 老師在專欄中的粉絲圖。

s= findedge(followerGraph,predecessors(followerGraph,1),1);nhsub.highlight(followerGrapnh.Edges.EndNodes(s,1),followerGraph.Edges.EndNodes(s,2),EdgeColor,r);n

紅線連起來的就是@Yu Jiang 老師魔爪伸向的地方……

有了Graph類方便的可視化系統,我們就可以利用MATLAB做一些很有趣的事情

比如查看我們的專欄是如何一步步走到今天的。還記得我們在這篇文章裡面建立的關注者追蹤系統嗎?

我們可以通過ThingSpeak Support Toolbox 來獲取專欄關注的實時人數,並把他們的關係圖畫出來。

下面就展示了一個非常簡單的動畫效果。

老闆:動畫做的不錯啊myc,不愧是當年學美術的

myc:?????

老闆:非常滿意,從今天開始你就是我們的正式員工了

myc:等這一天好久了……

老闆:來,送你個禮物

myc:這麼好!I am excited!是啥是啥??

myc:……後面那個花花袋子是什麼鬼

老闆:要好好工作哦

myc:好……謝…………等等,為什麼只有一個手柄????電源呢??

還有……

這尼瑪讓我接哪個顯示器??

-以此紀念轉正的俄羅斯實習生myc

還有從專欄開通1個多月來默默支持我們的近700名關注者


推薦閱讀:

數據可視化經歷了怎樣的發展歷程?
歐特克(autodesk)的一個能查看信息的BIM雲端軟體是什麼?
九種地理可視化方法,我們只能幫你到這了|鏑次元沙龍分享系列
大家說的智慧出遊,到底指的是什麼?
巧克力死忠粉調查報告

TAG:MATLAB | 数据可视化 |