自动为 Graphviz 中的节点分配颜色
Automatically assign color to nodes in Graphviz
我正在使用 Python 和 Graphviz 绘制一些由节点组成的聚类图。
我想根据属性为每个节点分配不同的颜色,例如它的 x-coordinate.
以下是我生成图形的方法:
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
哦,我想出了一个方法来得到我想要的东西。
只是为了记录和其他人可能有同样的问题(?)
可以只重新缩放颜色图并将相应的索引(颜色)分配给节点。
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'))
我正在使用 Python 和 Graphviz 绘制一些由节点组成的聚类图。 我想根据属性为每个节点分配不同的颜色,例如它的 x-coordinate.
以下是我生成图形的方法:
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
哦,我想出了一个方法来得到我想要的东西。 只是为了记录和其他人可能有同样的问题(?) 可以只重新缩放颜色图并将相应的索引(颜色)分配给节点。
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'))