根据文本生成词云的操作很常见,在某些场景下,我们可以遇到图标也按照某种形状排列的情况,那么可以用生成词云图的方法生成这样的图标词云图吗?
如何应用fontawesome
字体
当前最常见的图标字体就是web字体fontawesome
,它常常用于web中。那么在matplotlib
或者wordcloud
中如何应用这种字体呢。
下载fontawesome
字体
fontawesome
也支持在桌面端使用,https://fontawesome.com/how-to-use/on-the-desktop/setup/getting-started
即可下载fontawesome
字体。
建立图标和Unicode之间的映射
字体有了,该如何应用呢?
fontawesome
每个图标都有对应的Unicode,只要获取了图标和Unicode之间的对应关系就可以把图标当做普通的文本使用。
虽然https://fontawesome.com/cheatsheet
提供了图标和Unicode之间的映射关系,但是还需要将其整理为适当的数据结构。
网上有很多提供这种映射关系的库,直接应用这些第三方库更方便一些。比如:
- fontawesome:https://pypi.org/project/fontawesome/
- pywaffle:https://pypi.org/project/pywaffle/
最后总结下要点:
- 下载
fontawesome
字体 - 利用第三方库构造图标和字符之间的映射关系
案例:利用fontawesome
字体生成图标词云图
import numpy as np
from PIL import Image
from wordcloud import WordCloud
from matplotlib import pyplot as plt
from collections import Counter
from pywaffle.fontawesome_mapping import icons
# 利用pywaffle构造图标列表
text = list(icons['solid'].values())
# 生成字符、频率映射
word_counter = Counter(text)
# 构造词云
wc = WordCloud(font_path='Font Awesome 5 Free-Solid-900.otf', # 字体路径
width=400,
height=400,
mask=np.array(Image.open("1.jpg")),
max_words=500,
min_font_size=15,
max_font_size=45,
background_color='white',
colormap='Reds'
)
# 根据字符、频率映射生成词云
wc.generate_from_frequencies(word_counter)
# 显示词云
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.tight_layout()
plt.show()