2016-08-11 3 views
0

저는 파이썬과 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를 사용할 때 C = X 일부 비슷한입니다. 문제는 노드 (클러스터)의 수를 미리 알 수 없기 때문에 예를 들어 노드가 7 개인 경우 7 개의 노드가있는 그래프가 빨간색에서 시작하여 자주색으로 끝나기를 원합니다.

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

그래프 비트에는 어떤 속성이 있습니까? 또는 matplotlib의 색상 맵이 어떻게 작동하는지 알려 줄 수 있습니까?

불명의 점 죄송합니다. T^T

+0

grahpviz의 반환 값을 캡쳐 한 다음 'set_array','set_norm','set_cmap' 등을 호출하여 사용할 수 있습니다. – tacaswell

+0

그래프 작성 방법은? 노드에 대한 색상 할당이나 색상 할당 시퀀스 만 보입니까? –

+0

@Ohad Eytan 나는이 기사를 편집했다. Sry for unclear – 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')) 
관련 문제