matplotlib 使用Networkx将节点大小绘制为图例

fdx2calv  于 2023-02-13  发布在  其他
关注(0)|答案(2)|浏览(218)

在使用NetworkX时,我设法绘制了一个显示与节点属性相对应的节点大小的图形。为了生成一致的图形,我希望在图例中显示节点大小。是否有一种预先实现的方法来添加具有定义数量(例如,四个)的节点大小和相应节点属性的图例?
我想象一些类似于附加图例的东西。

qrjkbowd

qrjkbowd1#

我不确定是否有内置的方法可以做到这一点,但是networkx绘图算法使用scatter来设置节点大小,这样您就可以使用图例中使用的散布来创建一组 ghost 节点(我编造了术语 ghost,因为您实际上看不到它们。可能有一个官方接受的术语,我不知道)。
由于某种原因,我无法让这些值与scatter一起工作,所以我使用plot代替。(注意,scatter中值的大小遵循面积,而plot遵循宽度as discussed here,因此plot中使用的 ghost 值的大小是networkx.draw_networkx生成的大小的平方根。

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)

uwopmtnx

uwopmtnx2#

我有一个有点笨拙的替代方法,使用散点图legend_items,基本上用你的节点大小做一个散点图,复制图例,然后再删除散点图,可能是更整洁的方法,但是它很有效。

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")

相关问题