在NetworkX上向节点添加颜色属性以导出到Gephi

时间:2015-02-15 01:25:39

标签: colors attributes visualization networkx gephi

我正在使用NetworkX制作图形,以便导出以使用Gephi进行可视化。在我尝试添加颜色之前,我一直在向图表中的节点添加各种属性,没有问题。有没有人知道如何使用"彩色"导出图表?使用networkx的节点? (我已经写入gexf文件,但是如果它是另一种格式,只要它与Gephi兼容就不在乎。)

以下是我制作图表的代码:

def construct_weighted_graph(nodes, distance_dict, weighting_function, color = True):

  G = nx.Graph()
  #nodes automatically added when edges added. 
  for sequence in nodes: #loop through and add size attribute for num of sequences
    G.add_node(sequence)
    G.node[sequence]['size'] = distance_dict[sequence][1] #size represented by the node
    if color:
        G.node[sequence]['color'] = (0,1,0)
  for i_node1 in range(len(nodes)):
    dist_list = distance_dict[nodes[i_node1]][-2] #list of distances
    for i_node2 in range(i_node1+1, len(nodes)):
        G.add_edge(nodes[i_node1], nodes[i_node2], 
                   weight = weighting_function(dist_list[i_node2]))
  return G

这与我的颜色不完全相同,因为不同的节点被分配了不同的颜色,但这是基本的想法。

2 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题。在NetworkX中设置着色的常规方法不会导出为GEXF格式。通过阅读NetworkX和GEXF文档的导出代码,我发现了如何正确导出到GEXF,然后导入Gephi。

如果着色遵循与GEXF相同的结构,则NetworkX会导出着色。必须将数据添加到图形内的节点。所以你添加了一个密钥' viz'代表节点的可视化。你设置了' viz'到另一个字典,你可以在其中添加一个键颜色'反过来又是一个字典,其中包含键的值'''''''''' a'。

我做了一个非常简单的例子来演示解决方案:

import networkx as nx
""" Create a graph with three nodes"""
graph = nx.Graph()
graph.add_node('red')
graph.add_node('green')
graph.add_node('blue')
""" Add color data """
graph.node['red']['viz'] = {'color': {'r': 255, 'g': 0, 'b': 0, 'a': 0}}
graph.node['green']['viz'] = {'color': {'r': 0, 'g': 255, 'b': 0, 'a': 0}}
graph.node['blue']['viz'] = {'color': {'r': 0, 'g': 0, 'b': 255, 'a': 0}}
""" Write to GEXF """
# Use 1.2draft so you do not get a deprecated warning in Gelphi
nx.write_gexf(graph, "file.gexf", version="1.2draft")

这会将带有红色,绿色和蓝色节点的图形导出到GEXF。

您必须在尝试将颜色设置为的位置更改示例:

if color:
    G.node[sequence]['viz'] = {'color': {'r': 0, 'g': 1, 'b': 0, 'a': 0}} # line changed
for i_node1 in range(len(nodes)):

答案 1 :(得分:0)

networkx转换为GEXF格式(版本1.1draft)对我来说也是错误的。

但这对我有用。我在你需要的部分之前和之后添加了一些额外的代码,因为这意味着(我粗略地重读了我多年前写过的代码,但继续在这个网站上使用:http://djotjog.com/c/wordtree/ - 因为它仍然可以工作)您将节点添加到DiGraph(G)然后必须以不同的方式再次添加它们,以确保RGB colorsize格式在gexf文件的<node>标记内编码。

...代码

G.add_nodes_from(nodes) #<--- assigns node names, and also node 'size', used below

for n in G.node:
    n_size = G.node[n]['size']
    G.add_node(n,viz={'color':{'r':"170",'b':"170",'g':"170",'a':"0.7"},'size':n_size})
    #{'position':{'x':x,'y':y}}
G.add_weighted_edges_from(edges)
...
import codecs
f = codecs.open(gexf_filename, "wb", "utf-8") # unicode safe version of file-open
nx.write_gexf(G,f)
f.close()

注意:您可以为'viz'部分添加不仅仅是大小和颜色,但每个节点都必须有一个'viz'字母才能使颜色正常工作。我还在这里指定了alpha“a”作为RGBA格式的一部分,但它似乎没有出现在我的图表中。 networkx剥离了GEXF的那部分。我认为这是一个错误。在stackoverflow的其他地方,我发现了另一个无法控制xml头中命名空间的networkx错误。

该代码产生如下所示的GEXF XML节点:

<?xml version="1.0" encoding="utf-8"?><gexf xmlns:ns0="http://www.gexf.net/1.1draft/viz" version="1.1" xmlns="http://www.gexf.net/1.1draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">
<graph defaultedgetype="directed" mode="static">
<attributes class="node" mode="static">
  <attribute id="0" title="size" type="integer" />
</attributes>
<nodes>
  <node id="0" label="shop">
    <ns0:color b="100" g="100" r="100" />
    <ns0:size value="17" />
    <attvalues>
      <attvalue for="0" value="17" />
    </attvalues>
  </node>

ns0:部分至关重要。在attvalues中放置颜色不会在图表中转换为颜色。

这个版本没有颜色。请注意,节点“大小”必须以gexf格式定义才能工作,并且必须是整数。

<?xml version='1.0' encoding='utf-8'?>
<gexf version="1.1" xmlns="http://www.gexf.net/1.1draft" xmlns:viz="http://www.gexf.net/1.1draft/viz" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance">

<attributes class="node" mode="static">
  <attribute id="0" title="category" type="string" />
  <attribute id="1" title="color" type="string" />
  <attribute id="2" title="size" type="integer" />
</attributes>
<node id="CarterCenter" label="CarterCenter">
    <attvalues>
      <attvalue for="0" value="open data" />
      <attvalue for="1" value="blue" />
      <attvalue for="2" value="0" />
    </attvalues>
</node>

以下是用于调试目的的两个有用文件示例:

http://djotjog.com/s/gexf-web2/data/ocp_network.gexfhttp://djotjog.com/s/gexf-web2/data/ocp_network_test.gexf

你可以在这里看到他们在线渲染: http://djotjog.com/s/gexf-web2?file=data/ocp_network.gexf(带颜色) 和 http://djotjog.com/s/gexf-web2?file=data/ocp_network_test.gexf(相同的图表,没有颜色,但有alpha工作。