自定义形状:用图片当 mask
Custom Shape: Picture as Mask
用一张 PNG 图片(白色背景 + 黑色主体)当 mask,词云就会按图片形状填充。
1. 准备 mask 图片
- 白色背景(255) + 黑色主体(0),WordCloud 只识别亮度
- 推荐 1000×1000 像素,主体居中
- 想换什么形状就用什么形状:爱心、猫、Logo、地图
2. 加载 mask
import numpy as np
from PIL import Image
from wordcloud import WordCloud
# 读图片转 numpy 数组
mask = np.array(Image.open('heart.png'))
wc = WordCloud(
width=1000, height=1000,
mask=mask, # 关键!传入 mask
background_color='white',
font_path='/System/Library/Fonts/PingFang.ttc',
).generate(text)
wc.to_file('wordcloud_heart.png')
3. 不同 mask 效果对比
shapes = ['heart.png', 'cat.png', 'china_map.png', 'logo.png']
for shape in shapes:
mask = np.array(Image.open(shape))
wc = WordCloud(
width=1000, height=1000,
mask=mask, background_color='white',
font_path='/System/Library/Fonts/PingFang.ttc',
).generate(text)
out = f'wc_{shape.replace(".png", "")}.png'
wc.to_file(out)
print(f'已生成: {out}')
坑点:如果 mask 图片是
RGBA(带透明度),需要先转 RGB:mask = np.array(Image.open('xxx.png').convert('RGB'))
4. 配色:让词云更高级
import random
# 自定义颜色函数(每个词随机取色,但只从指定色板里取)
def color_func(word, font_size, position, orientation, random_state=None, **kwargs):
colors = ['#6e5cff', '#00d4ff', '#ff5cb3', '#ffd700', '#ff6b6b']
return random.choice(colors)
wc = WordCloud(mask=mask, color_func=color_func, ...).generate(text)
下节我们要解决的另一个常见需求 — 所有字大小一致(签名墙、Logo 拼图)。