工具&技巧 | 经济学圈特供 小刘帮你画专业社会网络图(一)
写在前面的话
我们的生活中,网络无处不在。社会网络(电话呼叫网络、人脉网络),知识网络(引文网络),科学网络(互联网、交通网络),生物网络(基因调控网络、食物网、神经网络),已经将我们团团包围。而复杂网络还有着更深刻的含义,具体可以参考
➭https://blog.csdn.net/qq997843911/article/details/80162157
“作为一名理科生,我们必须要能透过现象看本质”
”
经常关注大数据的同学肯定也有看到过各种形形色色的网格图表,它们给我的第一印象是,这么多乱七八糟的线条,能看出什么东西啊!关于这个,大家如有兴趣可以关注我们公司的公众号(微信号:gooddatatech),里面即将推出我们研发部神仙姐姐关于此方面的力作。
面对这么多线条,我理所当然的想到了一个经典、炫酷、无所不能的画图程序:“小海龟”画图。
但是,如果要用小海龟画图来画复杂网络图的话,那么绝大部分同学可是要叫爹叫娘了。为什么呢?
因为我们的眼里都是方块、圆圈和线条。要合理布置这些元素,可不是几十行代码能解决的。
那么,复杂网络图就这么难画了吗?并没有!下面我将分两期内容为大家介绍如何绘制并解读复杂网络图,本期主要介绍绘制社会网络图的一些基础知识,下期则是动手绘制两幅精美的社会网络图。
那么现在,就请大家跟我上我的步伐,一探复杂网络图的究竟吧!
ps:我的工作主要以写后端代码为主,在写这个项目之前,只接触过一些pyplot的代码演示,画图类的代码接触的比较少,所以如有哪里理解不到位的,还请大家多多指点。
networkx库简介
(图一)
ps:edge这个单词,一般译作“边缘”,也有“网络连接”的意思。我这边先统一称之为“连线”,便于理解。
网格骨架:节点坐标
注意:这个算法目前只在二维数据上有效,并且不会试图减少连线的交叉(This algorithm currently only works in two dimensions and does not try to minimize edge crossings)。
我们来看看这个shell_layout函数返回的对象长什么样:
{'浦东新区': array([0.2, 0. ]),
'嘉定区': array([0.062, 0.19 ]),
'闵行区': array([-0.162, 0.118]),
' 建邺区 ': array([-0.162, -0.118]),
' 浦东新区 ': array([ 0.062, -0.19 ]),
'建邺区': array([0.4, 0. ]),
'浦口区': array([-0.2 , 0.346]),
'宝山区': array([-0.2 , -0.346]),
' 浦口区 ': array([0.6, 0. ]),
' 吴中区 ': array([0.185, 0.571]),
' 嘉定区 ': array([-0.485, 0.353]),
' 闵行区 ': array([-0.485, -0.353]),
' 宝山区 ': array([ 0.185, -0.571]),
'鼓楼区': array([0.8, 0. ]),
'吴中区': array([-0.4 , 0.693]),
' 鼓楼区 ': array([-0.4 , -0.693])}
# 转自https://blog.csdn.net/qq_38826019/article/details/84233397
# 绕pointx,pointy逆时针旋转
def contrarotate(angle,valuex,valuey,pointx,pointy):
valuex = np.array(valuex)
valuey = np.array(valuey)
nRotatex = (valuex-pointx)*math.cos(angle) - (valuey-pointy)*math.sin(angle) + pointx
nRotatey = (valuex-pointx)*math.sin(angle) + (valuey-pointy)*math.cos(angle) + pointy
return nRotatex, nRotatey
# 绕pointx,pointy顺时针旋转
def rotate(angle,valuex,valuey,pointx,pointy):
valuex = np.array(valuex)
valuey = np.array(valuey)
sRotatex = (valuex-pointx)*math.cos(angle) + (valuey-pointy)*math.sin(angle) + pointx
sRotatey = (valuey-pointy)*math.cos(angle) - (valuex-pointx)*math.sin(angle) + pointy
左右滑动查看更多
网格属性:节点、连线、标签
draw(G, pos=None, ax=None, **kwds)
draw_networkx(G, pos=None, arrows=True, with_labels=True, **kwds)
左右滑动查看更多
节点
draw_networkx_nodes(G, pos, nodelist=None, node_size=300, node_color='#1f78b4', node_shape='o', alpha=None, cmap=None, vmin=None, vmax=None, ax=None, linewidths=None, edgecolors=None, label=None, **kwds)
左右滑动查看更多
import matplotlib.pyplot as plt
import networkx as nx
G = nx.cycle_graph(24)
pos = nx.spring_layout(G, iterations=200)
nx.draw(G, pos, node_color=range(24), node_size=800, cmap=plt.cm.Blues)
plt.show()
# 转自https://www.liangzl.com/get-article-detail-557.html
左右滑动查看更多
. Point marker
, Pixel marker
o Circle marker
v Triangle down marker
^ Triangle up marker
< Triangle left marker
> Triangle right marker
1 Tripod down marker
2 Tripod up marker
3 Tripod left marker
4 Tripod right marker
s Square marker
p Pentagon marker
* Star marker
h Hexagon marker
H Rotated hexagon D Diamond marker
d Thin diamond marker
| Vertical line (vlinesymbol) marker
_ Horizontal line (hline symbol) marker
+ Plus marker
x Cross (x) marker
连线
draw_networkx_edges(G, pos, edgelist=None, width=1.0, edge_color='k', style='solid', alpha=None, arrowstyle='-|>', arrowsize=10, edge_cmap=None, edge_vmin=None, edge_vmax=None, ax=None, arrows=True, label=None, node_size=300, nodelist=None, node_shape='o', connectionstyle=None, **kwds)
左右滑动查看更多
solid - 实线
dashed -- 短线
dashdot -.-.短点相间线
dotted:..... 虚点线
标签
标签不需要提前添加,可以直接画出来。
draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, ax=None, **kwds)
draw_networkx_edge_labels(G, pos, edge_labels=None, label_pos=0.5, font_size=10, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, ax=None, rotate=True, **kwds)
左右滑动查看更多
补充
rgb_to_hex = lambda rgb: '#' + ''.join([str(hex(num))[-2:].replace('x','0').upper() for num in rgb])
左右滑动查看更多
后记
一个团队中,必然会有项目的设计者与执行者,图表设计一般由设计者完成,我们一般属于执行者完成相应的需求。由于交流中存在“信息失真”、需求与实现能力不对等,所以“开发部门”与“产品部门”的矛盾是永远都会存在的。
更何况,在图表、软件、网页设计常常因为不同人审美的原因,会产生多次需求的变动,这就会带来工作量的增加进而延误项目进度。
”1、输出报表的结构变化,需要多增加十个图。
2、原始CSV数据的格式变为JSON并增加了数据维度。
那么我只需要增加一个画图模块,在报表里插入一些放置图片的代码就好了(就拿reportlab库来说,报表里内容的排版顺序都对应着程序里的代码顺序,哪里需要添加内容,就在对应的哪几行代码之间新加代码)。
但是对于第二种情况,就复杂多了,可以说,需要把绝大部分代码全部重写一遍。
►往期推荐
回复【Python】👉简单有用易上手
回复【学术前沿】👉机器学习丨大数据
回复【数据资源】👉公开数据
回复【可视化】👉你心心念念的数据呈现
回复【老姚专栏】👉老姚趣谈值得一看
►一周热文
学术前沿丨当计量经济学遭遇机器学习(四):高维回归之LASSO
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
欢迎扫描👇二维码添加关注