等大文字:签名墙 / Logo 拼图
Equal-Size Words: Signature Wall & Logo
wordcloud 默认字号 = 词频,频次高的大、频次低的小。但实际场景(签名墙、姓名拼图、Logo 文字)需要所有字大小完全一致。
1. 问题:wordcloud 默认字号跟频次挂钩
# 默认行为:size ~ frequency
wc = WordCloud(width=800, height=400).generate(text)
# → 频次最高的词字号最大
2. 解决方案:matplotlib 手画
import matplotlib.pyplot as plt
import random
words = ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十']
fig, ax = plt.subplots(figsize=(10, 6), dpi=120)
ax.set_xlim(0, 100)
ax.set_ylim(0, 60)
ax.axis('off')
# 1. 随机散点位置(避免重叠)
random.seed(42)
positions = []
for word in words:
while True:
x, y = random.uniform(10, 90), random.uniform(10, 50)
# 简单防重叠
if all(abs(x-px) > 12 or abs(y-py) > 6 for px, py in positions):
positions.append((x, y))
break
ax.text(x, y, word, fontsize=24, ha='center', va='center', color='#6e5cff')
plt.savefig('signature_wall.png', bbox_inches='tight', facecolor='white')
3. 更优雅:用 grid 排版
fig, ax = plt.subplots(figsize=(10, 6), dpi=120)
ax.axis('off')
n = len(words)
cols = 4
rows = (n + cols - 1) // cols
for i, word in enumerate(words):
row, col = i // cols, i % cols
x = (col + 0.5) / cols * 100
y = 100 - (row + 0.5) / rows * 100
ax.text(x, y, word, fontsize=22, ha='center', va='center', color='#00d4ff')
plt.savefig('grid_wall.png', bbox_inches='tight', facecolor='white')
4. Logo 文字拼图(把 logo 当 mask)
import numpy as np
from PIL import Image
# 读 logo 轮廓(纯黑底白字)
logo = np.array(Image.open('logo_outline.png').convert('L'))
h, w = logo.shape
# 找所有"白点"位置(logo 笔画上的点)
points = np.argwhere(logo > 128)
fig, ax = plt.subplots(figsize=(8, 8), dpi=120)
ax.set_xlim(0, w)
ax.set_ylim(0, h)
ax.axis('off')
ax.invert_yaxis() # 图像坐标翻转
for i, (y, x) in enumerate(points[::20]): # 每 20 个点取 1 个
word = words[i % len(words)]
ax.text(x, y, word, fontsize=10, ha='center', va='center')
plt.savefig('logo_text.png', bbox_inches='tight', facecolor='white')
应用场景:员工签名墙、毕业纪念册、Logo 周边商品、抽奖活动背景图。我们词云软件内置 5 种等大模式 + 30+ Logo 模板。
下一章进入文本分析"重头戏" — LDA 主题分析。学会后,5 万条评论 1 键生成主题气泡图。