【问题标题】:Substitute node labels with emoji using networkX in Python在 Python 中使用 networkX 用表情符号替换节点标签
【发布时间】:2016-01-16 10:00:31
【问题描述】:

我正在使用 networkX 从距离矩阵(emoji_sim、DataFrame)中绘制网络图。代码如下:

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 Emoji 包)。有没有办法做到这一点?非常感谢!

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

【问题讨论】:

  • 您想要更改标签,还是更改为节点绘制的实际圆圈?
  • 感谢您的提问。我正在尝试将圆圈更改为图像。
  • 我不认为它是内置的,但我认为它并不难。我没有时间研究整个解决方案,但这里有一个提示,希望能引导其他人填写详细信息:您可以使用 networkx 获取节点位置。然后使用 matplotlib 在这些位置绘制图像。然后画出边缘。

标签: python data-visualization networkx


【解决方案1】:

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

来自emoji python package 的表情符号cheat sheet 我选择了三个作为示例,这里是代码。

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- 我的机器在 ubunto 14.04 上,我无法显示任何表情符号,它们总是显示为矩形

使用以下命令(mentioned here)安装所需的字体Symbola

sudo apt-get install ttf-ancient-fonts

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

从几个有用的讨论中123456我复制并粘贴了 Symbola 的 .tff 字体文件到默认的 matplotib 目录中(它获取要使用的字体) .

cp /usr/share/fonts/truetype/ttf-ancient-scripts/Symbola605.ttf /usr/share/matplotlib/mpl-data/fonts/ttf

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

rm ~/.cache/matplotlib/fontList.cache

注意

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

【讨论】:

  • 看看nx.draw_networkx_labels (documentation),通常最好使用pos=nx.spring_layout(G) 或其他一些首选布局预定义pos 的位置。这让您可以在不改变节点位置的情况下对绘图执行多项操作。
  • 每次spring_layout 运行时,它都会从一个随机初始条件开始。所以如果你想做多种颜色,或者把一些节点放在其他节点之上,或者只是做任何涉及调用多个绘图命令的事情,整个网络将被重新定位。所以你是对的,在这种情况下没有必要,但对于你可能尝试的大多数复杂的事情,它很有用。由于您将线宽设置为零并将节点颜色设置为白色,而不仅仅是绘制标签,看起来您对 networkx 绘图命令的经验不如其他部分。我想我也会提到它。
  • 啊,现在更清楚了,感谢您的提示。从现在开始我会考虑的。
  • 我想如果我有边缘它们就不会出现在这里。事实证明,单独绘制标签更为重要。编辑实际上我已经尝试过,但即使线宽设置为零,边缘也会出现。
猜你喜欢
  • 2023-01-02
  • 2022-07-23
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多