Python NetworkX:中心有节点的圆形绘图

Python NetworkX:中心有节点的圆形绘图,python,python-2.7,matplotlib,networkx,Python,Python 2.7,Matplotlib,Networkx,我有一个简单的网络,其中有多个不同的“源”连接到一个特定的节点。源之间没有边界 我试图绘制一个漂亮的圆形图,其中特定节点位于中心,所有源节点都整齐地放置在该中心节点周围的一个圆圈中,与该中心节点的距离(即半径)相同。距离本身未定义,应与figsize相对 我设法使目标节点位于中心,并设法使其他节点形成一个漂亮的圆,但不能同时使两者都形成。即: 或: 我要做的是把红色节点放在中间 以下是用于创建图形和绘图的代码: import pandas as pd import networkx as n

我有一个简单的网络,其中有多个不同的“源”连接到一个特定的节点。源之间没有边界

我试图绘制一个漂亮的圆形图,其中特定节点位于中心,所有源节点都整齐地放置在该中心节点周围的一个圆圈中,与该中心节点的距离(即半径)相同。距离本身未定义,应与figsize相对

我设法使目标节点位于中心,并设法使其他节点形成一个漂亮的圆,但不能同时使两者都形成。即:

或:

我要做的是把红色节点放在中间

以下是用于创建图形和绘图的代码:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline

n = 283
n_new = 41

df = pd.DataFrame({'source': range(1, n+1),
                   'target':[0]*n,
                   'new_user':[0]*(n-n_new) + [1]*n_new
})

G = nx.from_pandas_dataframe(df, source='source', target='target', create_using=nx.DiGraph())
第一个情节:

plt.figure(figsize=(16,16))

# Node colors
val_map = df.iloc[:,:2].set_index('source').to_dict()['new_user']
val_map[0] = 2
values = [val_map.get(node, 0.25) for node in G.nodes()]

pos = nx.circular_layout(G, scale=2)

node_sizes = [1000] + [200]*283

nx.draw(G, cmap=plt.get_cmap('jet'), node_color=values, font_size=18,
        alpha=0.4, node_size=node_sizes, arrows=True,
               pos=pos)
第二幅图:

plt.figure(figsize=(16,16))

# node colors
val_map = df.iloc[:,:2].set_index('source').to_dict()['new_user']
val_map[0] = 2
values = [val_map.get(node, 0.25) for node in G.nodes()]


# Nodes layout/ position
fixed_positions = {0:(0,0)}
fixed_nodes = fixed_positions.keys()
pos = nx.spring_layout(G,pos=fixed_positions, fixed = fixed_nodes, k=15)
# pos = nx.circular_layout(G, scale=2)

node_sizes = [1000] + [200]*283

nx.draw(G, cmap=plt.get_cmap('jet'), node_color=values, font_size=18,
        alpha=0.4, node_size=node_sizes, arrows=True,
               pos=pos)

谢谢你的帮助

因此,函数
nx.circular\u layout
将值分布在原点(0,0)周围的一个半径为
scale
的圆上:

比例:浮动(默认值1) 位置的比例因子,即圆的半径

因此,您所需要做的就是定位源节点,在本例中是位于原点的节点
0

pos[0] = np.array([0, 0])
然后用
pos=nx.circular\u布局(G,scale=2)进行第一次绘图

或者更好的做法是,首先将节点定位在圆周围,而不考虑源,然后添加源:

pos = nx.circular_layout(list(range(1,284)), scale=2)
pos[0] = np.array([0, 0])
这将稍微改进您的图形:


小崽子,我不觉得自己很愚蠢吗。谢谢你知道如何让第二个情节看起来更好看吗?我的意思是,节点不必形成一个完美的圆/椭圆,但假设每个节点的边长度为x,则会有另一个节点的边长度相同,与之直接相对(因此边将围绕中心节点形成180度角)。当然,你自己回答了这个问题。取原点处圆的方程式
x^2+y^2=r^2
,并在圆上分布一些源节点。然后在
x^2+y^2=(r-c)^2
选择什么
c
。你甚至可以使用几个圆圈。如果我原来的帖子回答了你的问题,考虑接受它:哦,当然,只是(道歉)。有没有一种方法可以在不明确定义Cs的情况下完成它?我喜欢半径长度的随机性,只是不喜欢中心节点似乎不居中的最终结果(如果这有意义:)。此外,右中间那条令人讨厌的空白也令人讨厌!:D你知道这是一种在我演讲时会引起注意的东西,而不是唯物主义的东西:)我明白了。但我现在不知道如何改进,抱歉。您使用的是哪种版本的networkx?在最新版本中,您可以添加真正的箭头,甚至可以选择所需的箭头类型。此外,您还可以使用networkx中的一种写入格式导出图形,并在另一个软件(如Gephi)中打印漂亮的图形。