【MATLAB】 Graph Object(3): 展示关系网

 转自:https://zhuanlan.zhihu.com/p/20827594

myc这就把他呕心沥血的难产产物献给大家……

我们在上一篇讲Graph的文章中生成了一个专栏462名关注者的关系图。然而有句古话说的好

Code is cheap, show me the plot.

好在MATLAB新的Graph类自带了plot的函数

h  = plot(subsG);

 

这就是我们462个关注者及每个关注者的关注者的关系图。在人际关系图中,force graph更能体现出每个节点的重要性。我们来改变当前图的结构

h.layout('force')

 

放大看看是不是好一点?

并没有……主要是数据太多,都乌压压地在一起了。这里有5万多个节点,肯定看起来不方便。我们回到数据,想想最重要的是什么?

不就是我们专栏忠实的关注者吗?

于是我们取出这462位关注者,建立子图。在MATLAB中可以很方便的用subgraph功能从图中剥离出子图。

realFollower = subsG.findnode(ids);
followerGraph = subgraph(subsG,realFollower)
followerGraph = 

  digraph with properties:

    Edges: [990×1 table]
    Nodes: [462×3 table]

hsub = plot(followerGraph,'layout','force')

现在再来看看这462位关注者之间的关系,是不是比之前的清晰很多?

 

然而我们还可以做的更好。

我们的数据是多维的,比如每个关注者有自己的粉丝,如何在一个2维的图上显示出这个信息呢?

我们可以用每个节点的大小来代表他/她的粉丝数

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

看起来不错,如果同时把节点的颜色变成他/她的粉丝数呢?

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

 

瞬间变的清晰明了了有没有?突出一个大V

然而myc很快的意识到,粉丝数的多少对于专栏来说并没有什么大用。倒是一个关注者在专栏内有多少个其他关注者粉丝是个很有意思的数据。我们用图的入度indegree来表示一个节点有多少个粉丝。

hsub.NodeCData=indegree(followerGraph);

 

我们可以看到,之前的大V节点在专栏内其实并不是有最多“朋友”的。当然本来粉丝就少的关注者在专栏内也不会有很多粉丝。

我们来看看到底是谁在专栏内有最多的关注者。我们进入datacursor模式。点击最黄的那个节点

hd = datacursormode;

在专栏内有93个粉丝哟,几乎占了462人的20%。很大程度上可以说有20%的人都是因为他/她而关注MATLAB专栏的。

但是默认的datatip给出的信息太生肉了,还带着那个不是给人看的id。我们来写一个自己的显示datatip的方式

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

在回调函数中,显示当前节点的名字,粉丝数,和专栏中的粉丝数

function output_txt = GraphCursorCallback(obj,event_obj,g)
% Display the position of the data cursor
% obj          Currently not used (empty)
% event_obj    Handle to event object
% output_txt   Data cursor text (character vector or cell array of character vectors).

h = get(event_obj,'Target');
pos = get(event_obj,'Position');
ind = find(h.XData == pos(1) & h.YData == pos(2), 1);

output_txt = {g.Nodes.uName{ind},['Follower ',g.Nodes.Weight{ind}],['Friend in subscriber ',num2str(indegree(g,ind))]};
end

再点击那个节点看看,原来是

@李崇

 ,他自己有1000+的粉丝,在专栏中有93个粉丝,说明他粉丝中至少10%的人是和他在MATLAB上有交集的(大概

MATLAB的GraphPlot类还提供了方便的高亮功能,比如我们想看我们的第一位关注者

@Yu Jiang

 老师在专栏中的粉丝图。

s= findedge(followerGraph,predecessors(followerGraph,1),1);
hsub.highlight(followerGrap
h.Edges.EndNodes(s,1),followerGraph.Edges.EndNodes(s,2),'EdgeColor','r');

红线连起来的就是

@Yu Jiang

 老师魔爪伸向的地方……

有了Graph类方便的可视化系统,我们就可以利用MATLAB做一些很有趣的事情

比如查看我们的专栏是如何一步步走到今天的。还记得我们在这篇文章里面建立的关注者追踪系统吗?

我们可以通过ThingSpeak Support Toolbox 来获取专栏关注的实时人数,并把他们的关系图画出来。

下面就展示了一个非常简单的动画效果。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页