我想使用 Networkx 和 Matplotlib 为网络的边缘着色,其中每个边缘(i,j)的值都G[i][j]['label']在 0 和 1 之间。
但是,通常,这些值要么非常接近于零,要么非常接近于 1。因此很难将颜色的变化可视化,因为所有东西要么非常红,要么非常蓝(使用coolwarm颜色图)。
然后,我的想法是应用filtR像以下过滤器之一:
它只是一个多项式函数,它提供从 [0,1] 到 [0,1] 的双射,并在 0 或 1 附近拉伸更多值。如果需要,逆是可以处理的。
现在,我只是将它应用于边缘的值,以定义它的颜色:
cm = plt.get_cmap('coolwarm')
cNorm = colors.Normalize(vmin=0., vmax=1.)
scalarMap = cmx.ScalarMappable(norm=cNorm, cmap=cm)
colorList = []
# The color is defined by filtR(G[i][j]['label'])
val_map = {(i,j): filtR(G[i][j]['label']) for (i,j) in G.edges()}
values = [scalarMap.to_rgba(val_map[e]) for e in G.edges()]
edges = nx.draw_networkx_edges(G,edge_color=values,edge_cmap=plt.get_cmap('coolwarm'))
# Definition of the colorbar :-(
sm = cmx.ScalarMappable(cmap=cmx.coolwarm)
sm.set_array(values)
plt.colorbar(sm) …Run Code Online (Sandbox Code Playgroud)