Логично, что такой огромный график выглядит как ужасный беспорядок.На мониторе FullHD с 5000 узлами для каждого узла будет не более:
sqrt(1920 * 1080 / 5000) = 20
Изображение размером 20x20 пикселей для узла, текстовой метки и всех возможных ребер.Более того, человеческий мозг очень плохо манипулирует этим количеством данных , поэтому, даже если кто-то нарисует огромный график, он не сможет правильно его проанализировать.
В вашем случае у вас очень мало исходных узлов и тысячи целевых узлов для каждого исходного узла.Вы можете значительно уменьшить размер вашего графика, если вы просто удалите все целевые узлы, которые связаны только с одним исходным узлом (помните, что у вас все еще будет эта информация, и вы сможете проанализировать ее позже, просто распечатав всецелевые узлы, соответствующие конкретному исходному узлу):
G.remove_nodes_from([
n
for n in G.nodes
if n not in df['source_node']
if G.degree(n) < 2
])
Таким образом, окончательный код будет:
df = pd.DataFrame({
'source_node':['sc1','sc2','sc3'],
'target_node':['tg1,tg2,tg3,sc2','tg10,tg2,sc3','tg2,sc1'] })
df['splitted_targets'] = df['target_node'].apply(lambda x: x.split(','))
G = nx.DiGraph()
for r in df.iterrows():
for user in r[1]['splitted_targets']:
G.add_edge(r[1]['source_node'], user)
print(list(list(G.neighbors(n)) for n in G.nodes))
G.remove_nodes_from([
n
for n in G.nodes
if n not in df['source_node']
if G.degree(n) < 2
])
nx.draw(G, with_labels=True)
И этот график:
Будет уменьшено до:
Я уверен, что в вашем случае это очень поможет, потому что у вас естьтолько несколько десятков исходных узлов.Вы также можете играть с размерами узлов, метками узлов, шрифтами и т. Д.