MATLAB将地图转化为Graph,【转载】MATLAB Graph Object: 展示关系网

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

感谢原作者,受教匪浅,转载留记!

效果图

a4c26d1e5885305701be709a3d33442f.png

############################################################################

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

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

Code is cheap, show me the plot.

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

h = plot(subsG);

a4c26d1e5885305701be709a3d33442f.png这就是我们462个关注者及每个关注者的关注者的关系图。在人际关系图中,force

graph更能体现出每个节点的重要性。我们来改变当前图的结构

h.layout('force')

a4c26d1e5885305701be709a3d33442f.png放大看看是不是好一点?

a4c26d1e5885305701be709a3d33442f.png并没有……主要是数据太多,都乌压压地在一起了。这里有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位关注者之间的关系,是不是比之前的清晰很多?

a4c26d1e5885305701be709a3d33442f.png

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

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

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

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

a4c26d1e5885305701be709a3d33442f.png

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

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

a4c26d1e5885305701be709a3d33442f.png

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

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

hsub.NodeCData=indegree(followerGraph);

a4c26d1e5885305701be709a3d33442f.png

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

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

hd = datacursormode;

a4c26d1e5885305701be709a3d33442f.png

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

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

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

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

functionoutput_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上有交集的(大概

a4c26d1e5885305701be709a3d33442f.png

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');

a4c26d1e5885305701be709a3d33442f.png红线连起来的就是@Yu

Jiang老师魔爪伸向的地方……

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

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

我们可以通过ThingSpeak

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值