我正在导入名为network_nodes
的csv文件,该文件看起来像
['151753', '111598', '0.211413517594337', '-0.130335792899132']
['151753', '118516', '0.211413517594337', '-0.100253812968731']
其中前两列表示nodes
,最后两列是与这些节点关联的values
。
例如,此处名为'151753'
的节点连接到名为'111598'
和'118516'
的节点。节点'151753'
与value
的{{1}}相关联,而'111598'
与value
的-0.130335792899132相关联。
我想在Networkx中根据节点值使用不同的颜色(或节点大小)绘制此网络(例如,当值非常高时为红色/大,非常低时为蓝色/小)。
我不知道该怎么做。我知道我应该使用像
这样的东西G=nx.read_adjlist('network_nodes.csv', delimiter=',')
nx.draw(G)
但是read_adjlist函数不允许我导入节点值...
答案 0 :(得分:4)
您需要编写一些自定义内容来阅读您的文件。 这是一种方式:
node,weight,color
1,7.0,r
2,42,g
3,1,b
-
import csv
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
with open('nodelist.txt') as f:
reader = csv.DictReader(f)
for row in reader:
node = int(row.pop('node'))
G.add_node(node, **row)
print G.nodes(data=True)
# [(1, {'color': 'r', 'weight': '7.0'}), (2, {'color': 'g', 'weight': '42'}), (3, {'color': 'b', 'weight': '1'})]
绘图
nodes = G.nodes()
color = [G.node[n]['color'] for n in nodes]
size = [float(G.node[n]['weight'])*100 for n in nodes]
nx.draw(G, nodes=nodes,node_color=color, node_size=size)
plt.show()
答案 1 :(得分:3)
Aric是正确的,您需要编写一些自定义代码,但由于您有一个边缘列表,而不是一个节点列表,以下代码将更好地工作。
import csv
import networkx as nx
G = nx.DiGraph()
with open('network_nodes.csv') as f:
node_list = csv.reader(f)
for row in node_list:
G.add_edge(row[0],row[1])
G.node[row[0]]['value'] = float(row[2])
G.node[row[1]]['value'] = float(row[3])
G.nodes(data=True) #print out
打印以下内容:
[('151753', {'value': 0.211413517594337}),
('118516', {'value': -0.100253812968731}),
('111598', {'value': -0.130335792899132})]
答案 2 :(得分:1)
您引用的行不是csv文件格式。假设您更喜欢使用整数和浮点数而不是字符串,这将是正确的csv格式的数据:
151753,111598,0.211413517594337,-0.130335792899132
151753,118516,0.211413517594337,-0.100253812968731
您可以将数据作为列表加载,而不是使用csvreader,或者您可以使用以下sed命令转换文件
sed -i.bak "s/\[\(.*\)\]$/\1/" network_nodes
sed -i.bak "s/'\([0-9\.-]*\)'/\1/g" network_nodes
.bak
文件是可用于回滚sed命令的临时备份文件。完成后删除它们。使用csv加载器加载图形数据应该在执行此操作后成功。