柏拉图性格标签图
曾经风靡微信朋友圈、公众号的柏拉图性格标签,一夜带来千万粉丝的爆发式增长!如何生成一张性格标签图?调研了对比方案,我采用Python词云去绘制对应的图片。看一张效果图
h11.jpg
词云wordcloud可以用来做什么?
词云是文本大数据可视化的重要方式,可以将大段文本中的关键语句和词汇高亮展示。
可视化生动直观展示出枯燥文字背后的核心概念。进一步实现修改字体、字号、背景颜色、词云形状、勾勒边框、颜色渐变、分类填色、情感分析等高级玩法。简单的总结就是很牛逼。
词云的应用场景:
* 会议记录
* 海报制作
* PPT制作
* 生日表白
* 数据挖掘
* 情感分析
* 用户画像
* 微信聊天记录分析
* 微博情感分析
* Bilibili弹幕情感分析
* 年终总结
如何使用词云来绘制专属标签图?
1、安装对应的依赖包 sudo pip3 install wordcloud
2、wordcloud 的参数如下:
class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None, background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True, colormap=None, normalize_plurals=True)
3、这是wordcloud的所有参数,下面具体介绍一下各个参数:
font_path: string
字体路径,需要使用的字体路径(支持OTF和TTF)。Linux系统上默认指向DroidSansMono路径。若使用其他操作系统或者没有DroidSansMono字体,需要指定字体路径。
width: int(default=400)
画布宽度
height : int (default=200)
画布高度
prefer_horizontal : float (default=0.90)
尝试水平摆放字体和垂直摆放字体的比例,若prefer_horizontal < 1,当摆放不合适的时候,算法将尝试旋转单词。目前没有内置的方法来获取垂直单词
mask : nd-array or None(default=None)
如果不是None,则在哪里绘制单词时给出二进制掩码。 如果mask不是None,那么宽度和高度将被忽略,并且将使用mask的形状。 所有白色(#FF或#FFFFFF)条目将被视为“被遮盖”,而其他条目将被自由绘制。
scale : float (default=1)
计算值和绘图之间的缩放比例。 对于大型文字云图像,使用缩放而不是较大的画布尺寸要快得多,但可能导致较粗糙的文字。
min_font_size : int (default=4)
使用最小的字体大小。 当没有更多的空间时停止绘制。
font_step : int (default=1)
字体的步长。 font_step > 1时可能会加快计算速度,但会导致糟糕的字体适应性布局。
max_words : number (default=200)
单词的最大数目。
stopwords : set of strings or None
敏感词集合,这些词将被忽略。 如果没有,则将使用内置的STOPWORDS列表。
background_color : color value (default=”black”)
词云图像的背景颜色。
max_font_size : int or None (default=None)
使用的最大字体大小。 默认使用图像的高度。
mode : string (default=”RGB”)
当模式为“RGBA”且background_color为None时,会生成透明背景。
relative_scaling : float (default=.5)
字体大小的相对单词频率的重要性。 relative_scaling = 0时,只考虑单词等级。 使用relative_scaling = 1时,频繁两倍的单词将具有两倍的大小。 如果你想考虑单词的频率,而不仅仅是他们的等级,那么0.5左右的relative_scaling通常看起来不错。
color_func : callable, default=None
可用参数关键字font_size, position, orientation, font_path, random_state调用,它为每个单词返回一个PIL颜色。 覆盖"colormap"。 请参阅colormap来指定matplotlib的颜色映射。
regexp : string or None (optional)
正则表达式将输入文本拆分为待处理文本中的标记。 如果指定None,则使用r“\ w [\ w'] +”。
collocations : bool, default=True
是否包含两个词的搭配(bigrams),默认为True。
colormap : string or matplotlib colormap, default=”viridis”
Matplotlib色彩映射表为每个单词随机绘制颜色。 如果指定了“color_func”,则忽略。
normalize_plurals : bool, default=True
是否从文字中删除“尾随”。 如果为真,当出现以's'结尾的单词,则以's'结尾的单词将被删除,并将其计数添加到没有's'结尾的版本 ,以'ss'结尾的单词被忽略。
4、开始编码
import colorsys
import numpy as np
from PIL import Image,ImageColor
class GroupedColorFunc(object):
def __init__(self, color_to_words, default_color):
self.color_func_to_words = [
(self.get_single_color_func_override(color), set(words))
for (color, words) in color_to_words.items()
]
self.default_color_func = self.get_single_color_func_override(default_color)
def get_single_color_func_override(self, color):
old_r, old_g, old_b = ImageColor.getrgb(color)
rgb_max = 255.
h, s, v = colorsys.rgb_to_hsv(old_r / rgb_max, old_g / rgb_max,
old_b / rgb_max)
def single_color_func(word=None, font_size=None, position=None,
orientation=None, font_path=None, random_state=None):
r, g, b = colorsys.hsv_to_rgb(h, s, 1)
return 'rgb({:.0f}, {:.0f}, {:.0f})'.format(r * rgb_max, g * rgb_max,
b * rgb_max)
return single_color_func
def get_color_func(self, word):
try:
color_func = next(
color_func for (color_func, words) in self.color_func_to_words
if word in words)
except StopIteration:
color_func = self.default_color_func
return color_func
def __call__(self, word, **kwargs):
return self.get_color_func(word)(word, **kwargs)
import os
from os import path
from wordcloud import WordCloud,ImageColorGenerator
import matplotlib.pyplot as plt
import colorsys
import io
import base64
from .group_color_func import GroupedColorFunc
try:
from urllib.parse import quote
except ImportError:
from urllib import quote
import numpy as np
from PIL import Image,ImageColor
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
def word_cloud(object):
wordcloud = WordCloud(
font_path=path.join(d, '1.ttf'),
width=550,
height=550,
max_font_size=70,
min_font_size=20,
random_state=30,
margin=20,
prefer_horizontal=1,
background_color='#0C1027'
).generate_from_frequencies(object["words"])
color_to_words = object["colorConfigs"]
default_color = 'white'
grouped_color_func = GroupedColorFunc(color_to_words, default_color)
wordcloud.recolor(color_func=grouped_color_func)
img = wordcloud.to_image()
output_buffer = io.BytesIO()
img.save(output_buffer, format='png')
binary_data = output_buffer.getvalue()
base64_data = base64.b64encode(binary_data).decode('ascii')
return base64_data
遇到的坑:
1、docker 打包构建基础包 使用 python:3-alpine 构建一直失败,原因未找到。如果有大佬知道原因可以告知一下。后面该用乌班图的基础镜像打包正常。
2、词云包颜色背景做了随机函数颜色,我重写了包里面的方法 GroupedColorFunc可以自定义设置颜色。
3、文字的位置可以根据文档自行修改自定义,在这里就不做过多的展示。
4、注意下Node -> Python的base64图片的不一样。base64.b64encode(binary_data).decode('ascii')
网友评论