from math import sqrt
import networkx as nx
import matplotlib.pyplot as plt
# Create graph
G = nx.Graph()
N = 10 # number of nodes
for n in range(1,N + 1):
G.add_node(n, size = n * 100, pos = [0, n]) # size of node based on its number
# Draw graph
node_sizes = nx.get_node_attributes(G, 'size')
nx.draw_networkx(G, node_color = 'b', node_size = [v for v in node_sizes.values()])
# Make legend
for n in [2, 4, 6, 8]:
plt.plot([], [], 'bo', markersize = sqrt(n*100), label = f"{n}")
plt.legend(labelspacing = 5, loc='center left', bbox_to_anchor=(1, 0.5), frameon = False)
import matplotlib.pyplot as plt
import networkx as nx
from scipy.stats import expon
# some random graph
G = nx.erdos_renyi_graph(10, 0.5)
# some attribute that will influence node size
attribute = [70*i for i in range(10)]
# helper method for getting legend
def get_legend(sizes, num=10):
fig, ax = plt.subplots()
sc = ax.scatter([0]*len(sizes), [0]*len(sizes), s=sizes, color='blue')
store = sc.legend_elements("sizes", num=num)
fig.clf()
return store
fig, ax = plt.subplots()
nx.draw_networkx(G, node_size=attribute, ax=ax)
ax.legend(*get_legend(attribute, num=10), title="Variable A")
2条答案
按热度按时间qrjkbowd1#
我不确定是否有内置的方法可以做到这一点,但是
networkx
绘图算法使用scatter
来设置节点大小,这样您就可以使用图例中使用的散布来创建一组 ghost 节点(我编造了术语 ghost,因为您实际上看不到它们。可能有一个官方接受的术语,我不知道)。由于某种原因,我无法让这些值与
scatter
一起工作,所以我使用plot
代替。(注意,scatter
中值的大小遵循面积,而plot
遵循宽度as discussed here,因此plot
中使用的 ghost 值的大小是networkx.draw_networkx
生成的大小的平方根。uwopmtnx2#
我有一个有点笨拙的替代方法,使用散点图
legend_items
,基本上用你的节点大小做一个散点图,复制图例,然后再删除散点图,可能是更整洁的方法,但是它很有效。