社会关系网络网怎么绘制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了社会关系网络网怎么绘制相关的知识,希望对你有一定的参考价值。
参考技术A 最近需要绘制一些网络演示图,没找到合适的绘图工具,找了半天感觉学习成本都挺高的,感觉还是用Python搞效率高一些。之前用igraph的时候凑巧看过networkx,觉得和igraph-python相比,这个库至少是给人类用的,而且这个包好像是内置Graphviz的,不如我也用这个加matplotlib去绘图试试。今天试着画一个二分网络无向图,并且用圈圈表现出其社团关系,颜色表示节点种类。
1. 创建网络
G = nx.Graph()
G.add_node('1')
G.add_nodes_from(['2', '3'])
#注意如果加进去临边有未出现的节点,会自动创建节点
G.add_edge(1, 2)
G.add_edge('1', '2')
#实际上edges是个hash的key,还可以对应一个value
G.add_edge(n1, n2, object=x)
G.add_edges_from([('1', '2'), ('1', '3')])
list(G.adj['1'])
G.degree['1']
G.remove_node('2')
G.remove_edge('1', '3')
2. 为节点添加属性
G[1][3]['color'] = "blue"
G.edges[1, 2]['color'] = "red"
3. 快速遍历所有临边
FG = nx.Graph()
FG.add_weighted_edges_from([(1, 2, 0.125), (1, 3, 0.75), (2, 4, 1.2), (3, 4, 0.375)])
for n, nbrs in FG.adj.items():
for nbr, eattr in nbrs.items():
wt = eattr['weight']
if wt < 0.5: print('(%d, %d, %.3f)' % (n, nbr, wt))
4. 为图,节点,边添加属性
G = nx.Graph(day="Friday")
G.graph
5. 为节点添加属性
G.add_node(1, time='5pm')
G.add_nodes_from([3], time='2pm')
G.nodes[1]
G.nodes[1]['room'] = 714
G.nodes.data()
6. 为临边添加属性
G.add_edge(1, 2, weight=4.7 )
G.add_edges_from([(3, 4), (4, 5)], color='red')
G.add_edges_from([(1, 2, 'color': 'blue'), (2, 3, 'weight': 8)])
G[1][2]['weight'] = 4.7
G.edges[3, 4]['weight'] = 4.2
#注意的是weight这个属性不能胡乱用,这个是算法库里面处理时看做临边权重的属性,必须是数值型的。
7. 创建有向图
DG = nx.DiGraph()
DG.add_weighted_edges_from([(1, 2, 0.5), (3, 1, 0.75)])
#这个方向是按照第一个元素->第二个元素的
DG.out_degree(1, weight='weight') #0.5
DG.degree(1, weight='weight') #1.25
H = nx.Graph(DG)#有向图转为无向图
8. 创建multigraph
>>> MG = nx.MultiGraph()
>>> MG.add_weighted_edges_from([(1, 2, 0.5), (1, 2, 0.75), (2, 3, 0.5)])
>>> dict(MG.degree(weight='weight'))
1: 1.25, 2: 1.75, 3: 0.5
>>> GG = nx.Graph()
>>> for n, nbrs in MG.adjacency():
... for nbr, edict in nbrs.items():
... minvalue = min([d['weight'] for d in edict.values()])
... GG.add_edge(n, nbr, weight = minvalue)
...
>>> nx.shortest_path(GG, 1, 3)
[1, 2, 3]
9. 基础做图
G = nx.petersen_graph()
plt.subplot(121)
nx.draw(G, with_labels=True, font_weight='bold')
plt.subplot(122)
#这个draw_shell好像是按照某种叫shell的布局绘制
nx.draw_shell(G, nlist=[range(5, 10), range(5)], with_labels=True, font_weight='bold')
#传入选项
options = undefined
'node_color': 'black',
'node_size': 100,
'width': 3,
# 四种布局
plt.subplot(221)
nx.draw_random(G, **options)
plt.subplot(222)
nx.draw_circular(G, **options)
plt.subplot(223)
nx.draw_spectral(G, **options)
plt.subplot(224)
nx.draw_shell(G, nlist=[range(5,10), range(5)], **options)
1. 实战
1.1 画一个二分网络图,两类节点不同颜色,每个节点上有id,临边的颜色代表值,然后画两个区域。
B = nx.Graph()
B.add_nodes_from(['u1','u2','u3','u4'], bipartite='user')
B.add_nodes_from(['i1','i2','i3'], bipartite='item')
B.add_edge('u1','i1',weight=3)
B.add_edge('u1','i2',weight=4)
B.add_edge('u2','i1',weight=5)
B.add_edge('u2','i3',weight=1)
B.add_edge('u3','i3',weight=3)
B.add_edge('u4','i3',weight=4)
from networkx.algorithms import bipartite
import matplotlib as mpl
#区域就算了 搞了一下午还是没捣鼓出来怎么画
X = ['u1','u2','u3','u4']
Y = ['i1','i2','i3']
Edges = []
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(X) )
pos.update( (n, (2, i+0.5)) for i, n in enumerate(Y) )
nx.draw_networkx_nodes(B, pos, nodelist=X, node_color='slategray',alpha=0.95, node_size = 350, with_labels=False)
nx.draw_networkx_nodes(B, pos, nodelist=Y, node_color='steelblue',alpha=0.95, node_size = 350, with_labels=False)
nx.draw_networkx_labels(B,pos)
colors = [ B.edges[u,i]['weight'] for u,i in B.edges]
edges = nx.draw_networkx_edges(B, pos = pos, edge_color = colors,
width=3, edge_cmap=plt.cm.Blues, with_labels=False, edge_vmin = 0, alpha=0.9)
pc = mpl.collections.PatchCollection(Edges, cmap=plt.cm.Blues)
pc.set_array(colors)
plt.colorbar(pc)
ax = plt.gca()
ax.set_axis_off()
如何在R中绘制关系?
【中文标题】如何在R中绘制关系?【英文标题】:How to plot relationships in R? 【发布时间】:2012-11-02 22:16:50 【问题描述】:关系表示为矩阵x
,如下所示:
John Jack Mary Wendy
John 0 2 1 1
Jack 2 0 1 0
Mary 1 1 0 1
Wendy 1 0 1 0
这些条目是指它们拥有的连接数。 谁能告诉我如何在 R 中将其绘制为网络?谢谢!
【问题讨论】:
【参考方案1】:这称为邻接矩阵。
R FAQ 中有一些关于绘制以矩阵表示的社交网络的信息:
使用 igraph 可以轻松绘制社交网络数据 R 中的包。 [...] 为了让 igraph 包将此表识别为网络,我们可以首先将其转换为矩阵。然后,如果我们希望计算与图相关的统计信息(介数、接近度、度数),我们可以使用矩阵来创建图对象。
FAQ 给出了一些示例,生成了社会图,例如:
igraph
库本身是 documented here - 它可以生成更复杂的示例 - 请参阅 screenshots page 和下面的示例:
【讨论】:
以上是关于社会关系网络网怎么绘制的主要内容,如果未能解决你的问题,请参考以下文章