为networkx plot创建自己的colorbar

时间:2016-11-18 15:38:21

标签: python matplotlib colors networkx

我有以下问题我无法解决,虽然我现在花了几个小时,并认为这很容易。基本上我正在做的是绘制网络。每个节点的值介于0和1之间。现在,我根据每个节点的值为每个节点着色。 0对应于红色节点,1对应于绿色节点。我通过以下代码执行此操作:

for x in range(gn):
    G.add_node(x)
    cn = value[x]
    cn *= 100
    if cn == 100:
        cn = 99
    if cn < 50:
        # green to yellow
        cg = math.floor(255 * (cn / 50))
        cr = 255
    else:
        # yellow to red
        cg = 255
        cr = math.floor(255 * ((50 - cn % 50) / 50))
    cb = 0
    color_map.append('#%02x%02x%02x' % (cr, cg, cb))

然后在代码中:

fig, ax = plt.subplots()
nx.draw(G, pos, width=weights, node_color=color_map, ax=ax)
plt.show()

现在我只想在网络旁边放置一个颜色条,以便绘图的观察者可以概览哪个颜色对应的颜色。我希望你能帮助我。提前致谢 :) (即使在事件中,也存在值大于0.5左右的节点,颜色栏应该从0开始到1。)

编辑:最小工作示例:

import networkx as nx
import matplotlib.pyplot as plt
import numpy
import math

gn = 20
color_map = []
G = nx.Graph()
value = numpy.random.uniform(0, 1, gn)
for x in range(gn):
    G.add_node(x)
    cn = value[x]
    cn *= 100
    if cn == 100:
        cn = 99
    if cn < 50:
        # green to yellow
        cg = math.floor(255 * (cn / 50))
        cr = 255
    else:
        # yellow to red
        cg = 255
        cr = math.floor(255 * ((50 - cn % 50) / 50))
    cb = 0
    color_map.append('#%02x%02x%02x' % (cr, cg, cb))
pos = nx.spring_layout(G)

fig, ax = plt.subplots()

fig.subplots_adjust(bottom=0.2)
nx.draw(G, pos, node_color=color_map, ax=ax)
plt.show()

1 个答案:

答案 0 :(得分:2)

您可以使用matplotlib的自定义色彩映射功能来简化这一过程。请参阅示例http://matplotlib.org/examples/pylab_examples/custom_cmap.html

以下是使用networkx的方法。

import networkx as nx
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
import numpy

gn = 20
G = nx.Graph()
value = numpy.random.uniform(0, 1, gn)
G.add_nodes_from(range(gn))

# create colormap
cdict = {'red':   ((0.0, 1.0, 1.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 0.0, 0.0)),

         'green':  ((0.0, 0.0, 0.0),
                   (0.5, 1.0, 1.0),
                   (1.0, 1.0, 1.0)),

         'blue': ((0.0, 0.0, 0.0),
                   (1.0, 0.0, 0.0))
        }
green_yellow_red = LinearSegmentedColormap('GYR', cdict)
pos = nx.spring_layout(G)
nodes = nx.draw_networkx_nodes(G, pos, node_color=value, cmap=green_yellow_red)
# edges = nx.draw_networkx_nodes(G, pos) # no edges in this graph
plt.colorbar(nodes)
plt.axis('off')
plt.show()

enter image description here