在Python中使用networkX用表情符号替换节点标签

在Python中使用networkX用表情符号替换节点标签,python,data-visualization,networkx,Python,Data Visualization,Networkx,我正在使用networkX从距离矩阵(emoji_sim,一个数据帧)绘制网络图。代码如下: G = nx.from_numpy_matrix(np.array(emoji_sim)) nx.draw(G, edge_color='silver', node_color='lightsalmon', with_labels=True) plt.show() 我知道有一种方法可以将节点重新标记为: G = nx.relabel_nodes(G, dict(zip(range(len(G.node

我正在使用networkX从距离矩阵(emoji_sim,一个数据帧)绘制网络图。代码如下:

G = nx.from_numpy_matrix(np.array(emoji_sim))
nx.draw(G, edge_color='silver', node_color='lightsalmon', with_labels=True)
plt.show()
我知道有一种方法可以将节点重新标记为:

G = nx.relabel_nodes(G, dict(zip(range(len(G.nodes())), range(1, len(G.nodes())+1))))   
但是我想用图像替换节点标签(可能从文件中读取或使用Python表情包)。有办法吗?非常感谢


为了澄清这一点,我试图用图像来代替实际的圆圈。

它背后的想法并不困难,但为了让它显示出来(至少在ubto上),我花了一些时间,因为并非所有字体都支持表情符号。我将显示直接的方式,然后一些链接,帮助我在最后(也许你不会需要这些)

从表情符号中,我选择了三个作为示例,下面是代码

G = nx.Graph()
G.add_nodes_from([0,1,2])
n0 = emoji.emojize(':thumbsup:',use_aliases=True)
n1 = emoji.emojize(':sob:',use_aliases=True)
n2 = emoji.emojize(':joy:',use_aliases=True)
labels ={0:n0,1:n1,2:n2}
nx.draw_networkx(G,labels=labels, node_color = 'w', linewidths=0, with_labels=True, font_family = 'Symbola' ,font_size = 35)    
plt.show()

遇到的困难:

1-我的机器在UBTO 14.04上,我无法显示任何表情符号,它们总是显示为矩形

使用以下命令安装所需字体Symbola

2-Maplotlib(networkx调用它来绘制)未使用安装的字体

从几个有用的讨论中,我复制并粘贴了Symbola的.tff字体文件到默认的matplotib目录中(在那里获取字体以供使用)

然后我必须删除fontList.cache文件以加载新字体

rm ~/.cache/matplotlib/fontList.cache
注意


通过更改draw_networkx的输入,您可以拥有不同的视图,例如,不发送
线宽
将为每个节点显示圆形边框,如果您想要节点的特定背景颜色,也可以将
颜色_节点
从白色更改为您想要的颜色。。。有关更多详细信息,请查看。

是否要更改标签或为节点绘制的实际圆?谢谢您的提问。我正试图把圆圈变成图像。我不认为它是内置的,但我不认为这是难以置信的困难。我没有时间制定整个解决方案,但这里有一个提示,希望能引导其他人填写详细信息:您可以使用networkx获取节点位置。然后使用matplotlib在这些位置打印图像。然后画边。看一看
nx。画网络x_标签
(),而且通常最好用
pos=nx.spring\u布局(G)
或其他一些首选布局预定义位置
pos
。这样,您就可以在不更改节点位置的情况下对绘图执行多项操作。每次运行
spring\u layout
时,它都从随机初始条件开始。因此,如果您想使用多种颜色,或将某些节点置于其他节点之上,或只是执行任何涉及调用多个绘图命令的操作,整个网络都将重新定位。所以你是对的,在这种情况下这是不必要的,但是对于你可能尝试的最复杂的事情,它是有用的。由于您已将线宽设置为零,节点颜色设置为白色,而不仅仅是绘制标签,因此您似乎不像其他零件那样熟悉networkx绘制命令。我想我也应该提一下。啊,现在更清楚了,谢谢你的提示。从现在起我会考虑的。我想如果我有边缘,它们也不会出现在这里。事实证明,分开画标签更重要。编辑实际上我已经尝试过了,但是即使线宽设置为零,边缘也会出现。
cp /usr/share/fonts/truetype/ttf-ancient-scripts/Symbola605.ttf /usr/share/matplotlib/mpl-data/fonts/ttf
rm ~/.cache/matplotlib/fontList.cache