自动为Graphviz中的节点指定颜色

时间:2016-08-11 02:04:50

标签: python matplotlib plot graphviz

我正在使用python和Graphviz绘制一些由节点组成的集群图。 我想为节点分配不同的颜色(取决于属性,例如每个节点的x坐标)。

这是我制作图表的方式

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)

那么graphviz中的任何属性都可以做到吗? 或者任何人都可以告诉我matplotlib中的色彩映射是如何工作的?

抱歉不清楚。 T ^ T

1 个答案:

答案 0 :(得分: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'))