按值为边着色networkX - error edge_color必须是一个颜色或每条边一种颜色的列表



我使用下面的代码得到错误"edge_color must be a color or list of one color per edge"。数据框genres_grouped也包括在下面。

# Build a dataframe with your connections
test = pd.DataFrame({'from': genres_grouped['genre_1'],
'to': genres_grouped['genre_2'],
'value': genres_grouped['owner']})

# Build your graph
G=nx.from_pandas_edgelist(test, 'from', 'to', create_using=nx.Graph())

# Custom the nodes:
nx.draw(G, with_labels=True, node_color='skyblue', node_size=1500,
edge_color=test['value'], width=10.0, edge_cmap=plt.cm.Blues)

这是我的DataFramedict版本:

{'from':
{4864: 'Rap', 2129: 'Indie Rock', 1394: 'Dance & House',
2123: 'Indie Rock', 2117: 'Indie Rock', 4827: 'Rap',
1251: 'Country & Folk', 2284: 'Indie Rock', 2383: 'Indie Rock',
3978: 'Pop', 4508: 'R&B', 3805: 'Pop', 3954: 'Pop',
122: 'Alternative', 1484: 'Dance & House', 1388: 'Dance & House',
1159: 'Country & Folk', 4480: 'R&B', 2739: 'Latin', 4030: 'Pop',
2204: 'Indie Rock', 2115: 'Indie Rock', 4854: 'Rap', 5814: 'Rock',
5598: 'Rock', 4595: 'Rap', 1397: 'Dance & House', 4858: 'Rap',
116: 'Alternative', 4816: 'Rap', 3626: 'Pop', 4856: 'Rap',
5209: 'Religious', 3823: 'Pop', 4039: 'Pop', 3967: 'Pop',
3616: 'Pop', 1821: 'Electronica', 1830: 'Electronica',
2303: 'Indie Rock', 4848: 'Rap', 306: 'Alternative', 4664: 'Rap',
1827: 'Electronica', 4671: 'Rap', 5592: 'Rock', 3637: 'Pop',
5718: 'Rock', 5583: 'Rock', 4849: 'Rap'}, 'to': {4864: 'R&B',
2129: 'Alternative', 1394: 'Electronica', 2123: 'Alternative',
2117: 'Alternative', 4827: 'Pop', 1251: 'Rock', 2284: 'Pop',
2383: 'Rock', 3978: 'Rap', 4508: 'Rap', 3805: 'IndieRock',
3954: 'R&B', 122: 'IndieRock', 1484: 'Pop', 1388: 'Electronica',
1159: 'Pop', 4480: 'Pop', 2739: '-', 4030: 'Rock', 2204: 'Electronica',
2115: 'Alternative', 4854: 'R&B', 5814: 'Pop', 5598: 'Alternative',
4595: '-', 1397: 'Electronica', 4858: 'R&B', 116: 'IndieRock',
4816: 'Pop', 3626: 'Alternative', 4856: 'R&B', 5209: '-',
3823: 'IndieRock', 4039: 'Rock', 3967: 'Rap', 3616: '-',
1821: 'Dance&House', 1830: 'Dance&House', 2303: 'Pop', 4848: 'R&B',
306: 'Rock', 4664: 'Dance&House', 1827: 'Dance&House',
4671: 'Dance&House', 5592: 'Alternative', 3637: 'Alternative',
5718: 'IndieRock', 5583: '-', 4849: 'R&B'
},
'value': {4864: 15477, 2129: 13102, 1394: 10800, 2123: 9981, 2117: 7233,
4827: 6895, 1251: 4550, 2284: 4480, 2383: 4366, 3978: 4299, 4508: 3620,
3805: 3339, 3954: 3075, 122: 2975, 1484: 2961, 1388: 2733, 1159: 2725,
4480: 2689, 2739: 2660, 4030: 2627, 2204: 2590, 2115: 2561, 4854: 2550,
5814: 2491, 5598: 2487, 4595: 2328, 1397: 2327, 4858: 2268, 116: 2265,
4816: 2201, 3626: 2133, 4856: 2129, 5209: 2113, 3823: 2063, 4039: 1895,
3967: 1837, 3616: 1812, 1821: 1759, 1830: 1726, 2303: 1683, 4848: 1671,
306: 1671, 4664: 1653, 1827: 1648, 4671: 1646, 5592: 1586, 3637: 1548,
5718: 1514, 5583: 1493, 4849: 1481
}}

知道为什么我会得到这个错误吗?

虽然我的错误信息的文本有点不同,我相信你得到的错误,因为test['value']的形状是(50, )是不同于所需的形状。无论您如何指定颜色,您传递给的对象都需要与边的数量相同的长度。len(G.edges)输出24

您缺少的位是,当使用nx.Graph()构建图时,如果该边已经存在于图中,则networkx不会添加新边。由于在'from''to'列中存在重复对(例如,'from' = 'Rap''to' = 'Pop'有多行),因此不会将重复项添加为附加边。

所以你必须决定两件事:

  1. 应该重复行导致额外的,平行边?如果是,那么在构建图形时需要使用create_using=nx.MultiGraph()

  2. 节点顺序重要吗?即'from' = 'Rap, 'to' = 'Pop''from' = 'Pop', 'to' = 'Rap'不同吗?如果是这样,那么在构建图形时需要使用create_using=nx.DiGraph()

如果上面的1和2都为真,那么您需要使用create_using=nx.MultiDiGraph()。可视化这些更复杂的图形类型值得一个单独的问题,所以我不会在这里描述它。

一旦你回答了问题1和2,你需要处理你的输入数据来决定如何对'to''from'列进行分组,并对value列求和。

最新更新