Python wordcloud库如何按词权重为不同单词分配对应渐变深浅色
实现方案
wordcloud库默认的颜色分配逻辑确实是从colormap随机取色,要实现按词权重着色,你需要自定义颜色回调函数传入recolor方法的color_func参数,通过词对应的归一化权重映射到colormap的取值即可,修改后的完整代码如下:
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap from wordcloud import WordCloud def create_colormap(rgb_color=(45, 132, 200)): N = 256 color = np.ones((N, 4)) # 从目标色渐变到白色,权重越高颜色越接近目标色 color[:, 0] = np.linspace(rgb_color[0]/255, 1, N) color[:, 1] = np.linspace(rgb_color[1]/255, 1, N) color[:, 2] = np.linspace(rgb_color[2]/255, 1, N) cmap = ListedColormap(color) return cmap # 生成词云 cmap = create_colormap() text = "square test test test hello hello world" # 替换为实际文本 wc = WordCloud(background_color="white", repeat=True).generate(text) # 自定义按权重取色的回调函数 def weight_based_color(word, **kwargs): # wc.words_存储了所有词的归一化权重,范围0~1,值越大权重越高 norm_weight = wc.words_[word] # 权重越高颜色越接近colormap的深蓝色端,可自行调整映射规则 return cmap(1 - norm_weight) # recolor时传入自定义颜色函数生效 plt.axis("off") plt.imshow(wc.recolor(color_func=weight_based_color), interpolation="bilinear") plt.show()
关键逻辑说明
wc.words_是词云生成后自动存储的归一化词频字典,键为单词/ngram字符串,值为0~1之间的权重,权重最高的元素对应值为1- 你可以自行调整
cmap(1 - norm_weight)的映射规则,实现权重和colormap两端的对应关系,比如改成cmap(norm_weight)就能实现权重越高颜色越浅的效果
内容的提问来源于stack exchange,提问作者Anna Marchenkova
相关产品推荐
相关产品推荐

