在NetworkX中为节点添加颜色属性以导出到Gephi

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

这并不是我所说的颜色,因为不同的节点被分配了不同的颜色,但这是基本思路。


我一直在给我的图中的节点添加各种属性,没有任何问题,直到我尝试添加颜色时出现了问题。当您尝试添加颜色时发生了什么? - Joel
追溯(最近的调用在最后): 文件“../distances.py”,第216行,在<module>中, nx.write_gexf(G,path+desired_gene_file_format+"_graph_withcolors.gexf") 文件“<string>”,第2行,写入write_gexf 文件“/usr/lib/python2.7/dist-packages/networkx/utils/decorators.py”,第263行,在_open_file中, result = func(*new_args,**kwargs) 文件“/usr/lib/python2.7/dist-packages/networkx/readwrite/gexf.py”,第77行,写入write_gexf writer.add_graph(G) 文件“/usr/lib/python2.7/dist-packages/networkx/readwrite/gexf.py”,第287行,添加图形 - Hannah
self.add_nodes(G,graph_element) File "/usr/lib/python2.7/dist-packages/networkx/readwrite/gexf.py", line 318, in add_nodes node_data, default) File "/usr/lib/python2.7/dist-packages/networkx/readwrite/gexf.py", line 385, in add_attributes for val,start,end in v: TypeError: 'int' object is not iterable - Hannah
1
你能否更新你的帖子,提供一个完整的示例?这样我可以复制粘贴以查看相同的错误吗? - Joel
2个回答

5
我遇到了完全相同的问题。使用NetworkX设置颜色的常规方法无法导出到GEXF格式。通过阅读NetworkX和GEXF文档的导出代码,我已经找到了正确的导出到GEXF并进而导入到Gephi的方法。
如果着色符合GEXF的结构,NetworkX会导出着色。数据必须添加到图中的节点内部。所以你在节点上添加一个名为“viz”的键来表示可视化。你将'viz'设置为另一个字典,在其中添加一个名为“color”的键,该键有一个值为'r'、'g'、'b'和'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)):

0

networkx 转换为 GEXF 格式(版本 1.1draft)对我来说也有 bug。

但是这个方法对我有效。我在你需要的部分之前和之后添加了一些额外的代码,因为这意味着(在我匆忙重读多年前编写但仍在此网站上使用的代码时:http://djotjog.com/c/wordtree/ -- 因为它仍然有效),你需要将节点添加到 DiGraph (G),然后以不同的方式再次添加节点,以确保 RGB 颜色size 格式被编码在 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的其他地方,我发现了另一个networkx bug,即无法控制xml头中的命名空间。
该代码生成的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.gexf versus http://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 工作正常)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接