【问题标题】:Automatically assign color to nodes in Graphviz自动为 Graphviz 中的节点分配颜色
【发布时间】:2016-12-17 14:11:30
【问题描述】:

我正在使用 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)

我知道如何为图表分配颜色,但我正在寻找类似于使用 matplotlib 时的 c=x 部分的东西。

问题是我无法事先知道节点(集群)的数量,所以例如,如果我有 7 个节点,我仍然想要一个包含 7 个节点的图形,从红色节点开始,并以一个紫色的。

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

那么 Graphviz 中是否有任何属性可以做到这一点?

或者谁能告诉我 matplotlib 中的颜色图是如何工作的?

抱歉,不清楚。 T^T

【问题讨论】:

  • 您可以随时使用从 grahpviz 捕获返回,然后调用 set_arrayset_normset_cmap 等。
  • 您是如何制作图表的?您是只寻找节点的颜色分配还是颜色分配序列?
  • @Ohad Eytan 我编辑了这篇文章。抱歉不清楚
  • 您的问题是如何具体获取 matplotlib 颜色或如何为图形分配颜色?
  • 我知道如何为图形分配颜色,但我正在寻找类似于使用 matplotlib 时的 c=x 部分的东西。问题是我无法事先知道节点(集群)的数量,所以例如,如果我有 7 个节点,我仍然想要一个有 7 个节点的图形,从红色开始,以紫色结束。

标签: python matplotlib plot graphviz


【解决方案1】:

哦,我想出了一个方法来得到我想要的。 仅用于录制和其他人可能有同样的问题(?) 只需重新缩放颜色图并将相应的索引(颜色)分配给节点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2019-10-31
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多