LinuCエヴァンジェリスト・Open Source Summit Japan 2022ボランティアリーダーの鯨井貴博@opensourcetechです。
はじめに
こちらの記事でWordcloudを使ってみました。
今回は指定した範囲にもに文字列を配置するようにカスタマイズしてみます。
文字配置位置の決定
まずは範囲指定するための画像ファイルを用意します。
テスト用に用意したのは、仮面ライダーです。

それを元に輪郭だけ切り取り、文字を配置する部分を黒、配置しない部分を白で塗りつぶします。
Wordcloud化
画像の準備が出来たら、WordcloudすればOK。
画像ファイルと以下のPythonプログラムを同じディレクトリに格納して、
python3 word_cound_randome.py テキストファイル名 出力後のワードクラウド画像ファイル名と実行します。
https://github.com/kujiraitakahiro/python/blob/master/other_figures/word_count_random.py
import sys
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
# コマンドライン引数からテキストファイルと保存ファイルの名前を取得する
input_file = sys.argv[1]
output_file = sys.argv[2]
# テキストファイルからデータを読み込む
with open(input_file, "r") as f:
words = f.read().splitlines()
# 画像ファイルのマスクを読み込む
mask = np.array(Image.open("kamen.png"))
# ワードクラウドを作成する
# 日本語のフォントのパスを指定する
# 単語の重複表示は無効化する
wc = WordCloud(background_color="white",
mask=mask, # マスクを指定
font_path="/usr/share/fonts/meiryo/meiryo.ttc",
width=5000, height=3600,
collocations=False)
wordcloud = wc.generate(" ".join(words))
# ワードクラウドを表示する
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
# ワードクラウドをDPI350でファイルに保存する
plt.figure(figsize=(wordcloud.width / 100, wordcloud.height / 100), dpi=350)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.savefig(output_file, format='png', bbox_inches='tight', pad_inches=0)
plt.close()
完成形が、以下。
同じように星形やハート形の画像を用意すれば、以下のように作ることも出来ます。

使用するフォントの変更
各OSが持つフォントファイルをPythonに読み込ませることで、
変更が可能です。
https://www.opensourcetech.tokyo/entry/20230607/1686144210