首页 > 解决方案 > 试图在networkx中绘制不可见节点,但得到黑色节点

问题描述

我想在 networkx 中绘制一个完全不可见的节点。基本上它应该就好像它没有被绘制一样。但是,由于我的代码结构,我不能轻易不绘制它。如果我可以将 设置node_color为类似"Invisible".

由于 networkx 用于matplotlib.pyplot.scatter绘制节点,我想我会像 matplotlib 一样处理它。为此,只需将c特定标记的参数设置为字符串"None"(请参阅Plotting with a transparent marker but non-transparent edge)。

这是一个示例,其中 5 个标记中有 2 个不可见:

plt.scatter(range(5), range(5), c = ["None", "black", 'red', "None", 'blue'])

在此处输入图像描述

让我们用networkx试试:

G = nx.erdos_renyi_graph(100,0.03) 
nodelist = list(G.nodes())   
colorlist = ["None" if node%2==0 else "red" for node in nodelist] #even nodes should be invisible
nx.draw_networkx(G, nodelist=nodelist, node_color=colorlist) 

在此处输入图像描述

请注意,偶数节点不是不可见的,它们是黑色的。

我不明白,因为当我从networkx查看源代码时,相关行似乎是

node_collection = ax.scatter(xy[:, 0], xy[:, 1],
                             s=node_size,
                             c=node_color,
                             marker=node_shape,
                             cmap=cmap,
                             vmin=vmin,
                             vmax=vmax,
                             alpha=alpha,
                             linewidths=linewidths,
                             edgecolors=edgecolors,
                             label=label)

所以colorlist应该直接发送到scatter没有任何改变。

谁能解释为什么会这样?为什么这些节点变成黑色?

标签: pythonmatplotlibnetworkx

解决方案


找到问题需要一些时间,但我能够通过以下方式重现networkx行为matplotlib

pl.scatter(range(5), range(5), c = ["None", "black", 'red', "None", 'blue'], alpha=1.0)

Networkx默认参数alpha=1.0(与alpha=Noneof不同matplotlib)。以下对我有用:

nx.draw_networkx(G, nodelist=nodelist, node_color=colorlist, alpha=None, with_labels=False) 

感谢@Paul Brodersen 的评论:看起来不同的默认值已解决:比较2.3最新(2.4.xy) 的代码。


推荐阅读