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