matplotlibを使いこなして複数のword cloudをpdf1枚にまとめる

pythonの大変便利なライブラリにwordcloudがあります。
私はgensimでトピックモデルを扱ったときに特にこれにお世話になりました。

github.com

本記事では「matplotlibを使って複数のwordcloudを単一のpdfにまとめるコード」を紹介します。

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages
from wordcloud import WordCloud
from gensim.models.ldamodel import LdaModel

lda = LdaModel.load(file_path)
# 訓練済みトピックモデルをロードしています。

wc = WordCloud(font_path='/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf')
pdf = PdfPages(pdf_path)
fig, axes = plt.subplots(nrows=10, ncols=2, figsize=(10,30), dpi=dpi)

for k, ax in enumerate(axes.flat):
    topic_word_freq = dict(lda.show_topic(k, 100))
    wc_plt = wc.generate_from_frequencies(topic_word_freq)
    ax.imshow(wc_plt, interpolation='bilinear')
    ax.axis("off")
    ax.set_title("トピック{} ワードクラウド".format(k))

fig.tight_layout()
pdf.savefig()
pdf.close()
fig.clf()

以上のコードでは、おおまかに言って以下の処理をしています。

  1. plt.subplots() で 10行2列のaxesを作成する。10行2列 = 20フィールドは、上記の例ではトピックの個数に一致します。
  2. axesをイテレータとして、ここのフィールド(ax)に以下の処理をする。
    1. wc.generate_from_frequencies()によってワードクラウドの画像を作成する。
    2. ax.imshow() によって、ax に画像を表示する。
  3. レイアウトを整えてpdfに出力。

axとはmatplotlibの基礎概念で「図表」のことをさします。axesとはその複数形です。
上記コードではplt.subplots()で「白紙の図表20個」を作成した後で、axesをイテレーションしながら1つずつ白紙を埋めていくわけです。

私がこれまでに読んできたpython入門書(みんなのpythonオライリー機械学習本)では、この辺の「matplotlibの思想」的な部分が見えにくくなっていましたが、下記のチュートリアルをこなしておくとmatplotlibの全体像がスッキリと見えるのでおすすめです。ちなみに下記チュートリアルはmatplotlib公式からもリンクがあります。

github.com