netwokx学习记录

参考博客文章:

这里是引用https://blog.csdn.net/D_Ddd0701/article/details/131057961

networkx

名著人物关系

数据集下载地址

# 使用名著中的人物关系建立图
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv("E:\\download\\三国演义\\triples.csv")
df.head()
# 通过边列表创建有向图
G = nx.DiGraph()
edges = [edge for edge in zip(df['head'], df['tail'])] # 使用zip构建边列表
print(edges)
G.add_edges_from(edges)
G.edges('关羽')
# 可视化
pos = nx.spring_layout(G, seed=123)
plt.figure(figsize=(15,15))
nx.draw(G, pos, with_labels=True)

如图所示
在这里插入图片描述

美化图

原始图

seed = 13648
G = nx.random_k_out_graph(10, 3, 0.5, seed=seed)
pos = nx.spring_layout(G, seed=seed)
nx.draw(G, pos, with_labels=True)

如图所示:
在这里插入图片描述
美化:

from igraph.drawing.shapes import mpl

# 美化
node_size = [12 + 10*i for i in range(len(G))]
print(node_size)
M = G.number_of_edges() # 边
print(M)
edge_colors = range(2, M+2)
edge_alphas = [(5+i)/ (M+4) for i in range(M)]
cmap = plt.cm.plasma
plt.figure(figsize=(10,8))
nodes = nx.draw_networkx_nodes(G, pos,node_size=node_size, node_color='indigo')
edges = nx.draw_networkx_edges(
    G,
    pos,
    node_size=node_size,
    arrowstyle='->',
    arrowsize=20,
    edge_color=edge_colors,
    edge_cmap = cmap,
    width=4
)

for i in range(4):
    edges[i].set_alpha(edge_alphas[i])

pc = mpl.collections.PathCollection(edges, cmap=cmap)
pc.set_array(edge_colors)
plt.colorbar(pc)

ax = plt.gca()
ax.set_axis_off()
plt.show()

如图所示:
在这里插入图片描述

最大连通域子图

这部分是我比较感兴趣的,是怎么找到连通域子图的,

# 最大连通域子图
import networkx as nx
import  matplotlib.pyplot as plt
G = nx.gnp_random_graph(100, 0.02, seed=10374196)
pos = nx.spring_layout(G, seed = 10)
nx.draw(G ,pos)

画最大连通子图

'''
先是得到图中的所有连通组件,然后排序取第一个元素就是最大的一个连通图,获取子图
'''
Gcc = G.subgraph(sorted(nx.connected_components(G), key=len,reverse=True)[0])
pos = nx.spring_layout(Gcc, seed=10396953)
nx.draw_networkx_nodes(Gcc, pos, node_size=20)
nx.draw_networkx_edges(Gcc, pos, alpha=0.4)

两幅图如下所示:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 Python 中,使用多进程画子图通常不是直接操作图形界面,因为绘图通常是发生在主线程里的,而进程间通信(IPC)可能会带来同步和数据共享的问题。然而,如果你想要在多个进程中独立地创建和更新图表,可以考虑以下几种方法: 1. **Multiprocessing 模块**:你可以创建单独的子进程来执行绘图任务,每个进程都有自己的一套数据。然后,可以利用进程间的通信机制(如`Queue`或`Pipe`)将新数据传递到绘图进程,它们再负责更新子图。记得在主线程中管理这些进程以保持整个程序的正常运行。 2. **Matplotlib 的 `Figure` 子类**:虽然`matplotlib.figure.Figure`本身不是一个进程,但你可以创建多个`Figure`实例,在各自的进程中分别绘制。然后,使用`Manager`对象来共享数据,确保各个子进程对数据的操作是线程安全的。 ```python from multiprocessing import Pool, Manager import matplotlib.pyplot as plt def draw_subplot(i): fig = plt.figure() ax = fig.add_subplot(2, 2, i+1) # 在这里使用数据更新子图 manager = Manager() data = manager.list([0, 0]) # 共享数据 ax.plot(data) with Pool(processes=4) as pool: pool.map(draw_subplot, range(4)) ``` 3. **Dask 或 IPython.parallel**:对于大数据量的计算和可视化,可以借助 Dask 的分布式计算框架或者 IPython 的 parallel 部署工具,创建并行的计算任务。 请注意,由于并发和数据共享的复杂性,务必保证正确处理资源竞争、锁等问题以避免潜在的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值