python - Networkx 中 Louvain 分区的可视化

标签 python algorithm networkx

请帮我改变Louvain聚类算法结果的可视化。 我从网站上获取了代码 https://github.com/taynaud/python-louvain 我可以重写代码,使每个簇都有自己的形状(圆形、三角形、方形...)吗?

import community as community_louvain
import matplotlib.cm as cm
import matplotlib.pyplot as plt
import networkx as nx

# load the karate club graph
G = nx.karate_club_graph()

# compute the best partition
partition = community_louvain.best_partition(G)

# draw the graph
pos = nx.spring_layout(G)
# color the nodes according to their partition
cmap = cm.get_cmap('viridis', max(partition.values()) + 1)
nx.draw_networkx_nodes(G, pos, partition.keys(), node_size=40,
                       cmap=cmap, node_color=list(partition.values()))
nx.draw_networkx_edges(G, pos, alpha=0.5)
plt.show()

最佳答案

不幸的是nx.draw_networkx_nodes不接受可迭代的形状,因此您必须循环遍历节点并单独绘制它们。此外,我们必须对生成的 cmap 建立索引,否则,单值社区值将映射到相同的初始 cmap 颜色。对于可能的形状,我只是复制 docs 中提到的可用形状字符串。并根据分区号对其进行索引:

# load the karate club graph
G = nx.karate_club_graph()

# compute the best partition
partition = community_louvain.best_partition(G)

cmap = cm.get_cmap('viridis', max(partition.values()) + 1)
shapes = 'so^>v<dph8'

plt.figure(figsize=(12,8))
# draw the graph
pos = nx.spring_layout(G)
# color the nodes according to their partition
cmap = cm.get_cmap('viridis', max(partition.values()) + 1)
nx.draw_networkx_edges(G, pos, alpha=0.5)
for node, color in partition.items():
    nx.draw_networkx_nodes(G, pos, [node], node_size=100,
                           node_color=[cmap.colors[color]],
                           node_shape=shapes[color])

enter image description here

关于python - Networkx 中 Louvain 分区的可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62890682/

相关文章:

python - 列出所有可能总和达到某个值的列表

c - 低内存条件下的 LZW 压缩/解压缩

python - 如何在 networkx 图形绘图中显示循环

python - 如何在 DataFrame 的每一行上添加两列的 value_counts?

python - 获取 NetworkX 图中的连接节点

Python:嵌套 `for` 循环

python - 如何获取可迭代对象中的第 i 个项目。 Django/Python

python - 独立于平台的方式来查找 libpython 的路径(例如,用于 cmake)

python - 如何在 python 中打印出 calendar.month_name 数组?

c++ - 如何有效地处理单个时间线上传入的延迟事件?