Substitute node labels with emoji using networkX in Python
我正在使用 networkX 从距离矩阵(emoji_sim,一个 DataFrame)中绘制一个网络图。这是代码:
| 1 2 3 |
G = nx. from_numpy_matrix (np. array (emoji_sim ) ) nx. draw (G , edge_color = ‘silver’ , node_color = ‘lightsalmon’ , with_labels = True ) plt. show ( ) |
我知道有一种方法可以将节点重新标记为:
| 1 | G = nx. relabel_nodes (G , dict ( zip ( range ( len (G. nodes ( ) ) ) , range ( 1 , len (G. nodes ( ) )+ 1 ) ) ) ) |
但我想用图像替换节点标签(可能从文件中读取或使用 Python Emoji 包)。有没有办法做到这一点?非常感谢!
为了澄清,我试图用图像代替实际的圆圈。
- 您想要更改标签,还是要更改节点的实际圆圈?
- 谢谢你的问题。我正在尝试将圆圈更改为图像。
- 我不认为它是内置的,但我认为这并不难。我没有时间研究整个解决方案,但这里有一个提示,希望能引导其他人填写详细信息:您可以使用 networkx 获取节点位置。然后使用 matplotlib 在这些位置绘制图像。然后画出边缘。
它背后的想法并不是很难,但为了让它显示出来(至少在 ubunto 上),它给了我一些困难,因为并非所有字体都支持表情符号。我将显示直接的方式,然后显示一些最终帮助我的链接(也许你不需要那些)。
我从 emoji python 包中的 emoji 备忘单中挑选了三个作为示例,这里是代码。
| 1 2 3 4 5 6 7 8 |
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 | sudo apt-get install ttf-ancient-fonts |
2- Maplotlib (which networkx calls to draw) is not using the installed font.
从几个有用的讨论中 1 2 3 4 5 6 我将 Symbola 的 .tff 字体文件复制并粘贴到默认的 matplotib 目录中(它获取要使用的字体)。
| 1 | cp /usr/share/fonts/truetype/ttf-ancient-scripts/Symbola605. ttf /usr/share/matplotlib/mpl-data/fonts/ttf |
然后我必须删除 fontList.cache 文件才能加载新字体。
| 1 | rm ~/. cache/matplotlib/fontList. cache |
注意
您可以通过更改 draw_networkx 的输入来获得不同的视图,例如不发送 linewidths 将为每个节点显示圆形边框,如果您想要节点的特定背景颜色,请将 color_node 从白色更改为您想要的颜色…有关更多详细信息,请查看文档。
- 看看 nx.draw_networkx_labels (文档),通常最好用 pos=nx.spring_layout(G) 或其他一些首选布局预定义位置 pos 。这让您可以在不改变节点位置的情况下对绘图执行多项操作。
- 每次 spring_layout 运行时,它都会从一个随机的初始条件开始。所以如果你想做多种颜色,或者把一些节点放在其他节点之上,或者只是做任何涉及调用多个绘图命令的事情,整个网络将被重新定位。所以你是对的,在这种情况下它不是必需的,但对于你可能尝试的最复杂的事情,它是有用的。由于您将线宽设置为零并将节点颜色设置为白色,而不仅仅是绘制标签,看起来您对 networkx 绘图命令的经验不如其他部分。我想我也会提到它。
- 啊,现在更清楚了,感谢您的提示。从现在开始我会考虑的。
- 我想也在这里,如果我有边缘,它们就不会出现。事实证明,单独绘制标签更为重要。编辑实际上我已经尝试过,但即使线宽设置为零,边缘也会出现。
声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)