2016-08-11 4 views
0

Я использую python и Graphviz для рисования некоторого кластерного графа, состоящего из узлов. Я хочу присвоить узлам различные цвета (в зависимости от атрибута, например координаты x каждого узла).Автоматически назначать цвет узлам в Graphviz

Вот как я произвожу граф

def add_nodes(graph, nodes): 
    for n in nodes: 
     if isinstance(n, tuple): 
      graph.node(n[0], **n[1]) 
     else: 
      graph.node(n) 
    return graph 

A = [[517, 1, [409], 10, 6], 
    [534, 1, [584], 10, 12], 
    [614, 1, [247], 11, 5], 
    [679, 1, [228], 13, 7], 
    [778, 1, [13], 14, 14]] 

nodesgv = [] 

for node in A: 
    nodesgv.append((str(node[0]),{'label': str(node[0]), 'color': ???, 'style': 'filled'})) 

graph = functools.partial(gv.Graph, format='svg', engine='neato') 
add_nodes(graph(), nodesgv).render(('img/test')) 

А теперь я хочу, чтобы назначить цвет каждому узлу с упорядочением первого значения каждого узла. Более конкретно, что я хочу, это красный узел (517), желтый узел (534), зеленый узел (614), синий узел (679) и фиолетовый узел (778).

enter image description here

Я знаю, как назначить цвета на графике, но шляпа я ищу что-то похожее на с = х части при использовании Matplotlib. Проблема в том, что я не могу заранее знать количество узлов (кластеров), поэтому, например, если у меня есть 7 узлов, мне все же нужен график с 7 узлами, начинающимися с красного, и заканчивающимися фиолетовым.

plt.scatter(x, y, c=x, s=node_sizes) 

Значит, есть ли какой-либо атрибут в graphviz? Или может кто-нибудь сказать мне, как работает colormap в matplotlib?

Извините за неясность. T^T

+0

Вы всегда можете использовать захват возврата из grahpviz, а затем называть 'set_array',' set_norm', 'set_cmap' и т. Д. – tacaswell

+0

Как вы производите свой график? Вы смотрите только на назначение цвета на узел или для последовательности назначения цвета? –

+0

@ Ohad Eytan Я отредактировал статью. Sry для неясно – Chu

ответ

0

О, я понял, как получить то, что я хочу. Просто для записи и для кого-то другого может возникнуть такая же проблема (?) Можно просто перемасштабировать цветовую карту и назначить соответствующий индекс (цвета) для узлов.

def add_nodes(graph, nodes): 
for n in nodes: 
    if isinstance(n, tuple): 
     graph.node(n[0], **n[1]) 
    else: 
     graph.node(n) 
return graph 

A = [[517, 1, [409], 10, 6], 
    [534, 1, [584], 10, 12], 
    [614, 1, [247], 11, 5], 
    [679, 1, [228], 13, 7], 
    [778, 1, [13], 14, 14]] 

nodesgv = [] 
Arange = [ a[0] for a in A] 
norm = mpl.colors.Normalize(vmin = min(Arange), vmax = max(Arange)) 
cmap = cm.jet 

for index, i in enumerate(A): 
    x = i[0] 
    m = cm.ScalarMappable(norm = norm, cmap = cmap) 
    mm = m.to_rgba(x) 
    M = colorsys.rgb_to_hsv(mm[0], mm[1], mm[2]) 
    nodesgv.append((str(i[0]),{'label': str((i[1])), 'color': "%f, %f, %f" % (M[0], M[1], M[2]), 'style': 'filled'})) 

graph = functools.partial(gv.Graph, format='svg', engine='neato') 
add_nodes(graph(), nodesgv).render(('img/test'))