2016-11-18 4 views
1

У меня есть следующая проблема, которую я не мог решить, хотя сейчас трачу на это несколько часов и считаю, что это будет легко. В основном я занимаюсь построением сетей. Каждый узел имеет значение от 0 до 1. Теперь я цвет каждого узла в соответствии с его значением. 0 соответствует красному узлу и 1 - зеленому узлу. Я делаю это с помощью follwing кода:Создайте собственную панель цветов для графика networkx

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() 

Теперь я просто хочу, чтобы иметь Colorbar рядом с сетью, так что наблюдатель участка имеет какой цвет соответствует значению. Я надеюсь, что вы можете мне помочь. Заранее спасибо :) (The Colorbar должна начинаться от 0 до 1, даже в том случае, что есть также узлы со значениями выше 0,5 или около того.)

Edit: Минимальный рабочий пример:

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() 
+0

Вы можете отделяйте создание графа от и преобразование цвета обеспечивают минимальный пример, который имеет '' gn' или G' определенный ?! – ImportanceOfBeingErnest

+0

Был ли минимальный пример. Надеюсь, что поможет :) – HighwayJohn

ответ

2

Вы можете использовать специальные возможности colplap для использования 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

+0

Спасибо большое! :) – HighwayJohn

+0

Что такое аргументы 'cdict'? То есть, как вы определяете, что наибольшее значение «1.0» связано с «зеленым»? – FaCoffee

+0

Просмотрите комментарии по ссылке http://matplotlib.org/examples/pylab_examples/custom_cmap.html, чтобы узнать о значениях. – Aric

Смежные вопросы