matplotlibを使いこなして複数のword cloudをpdf1枚にまとめる
pythonの大変便利なライブラリにwordcloudがあります。
私はgensimでトピックモデルを扱ったときに特にこれにお世話になりました。
本記事では「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()
以上のコードでは、おおまかに言って以下の処理をしています。
plt.subplots()
で 10行2列のaxesを作成する。10行2列 = 20フィールドは、上記の例ではトピックの個数に一致します。- axesをイテレータとして、ここのフィールド(ax)に以下の処理をする。
wc.generate_from_frequencies()
によってワードクラウドの画像を作成する。ax.imshow()
によって、ax に画像を表示する。
- レイアウトを整えてpdfに出力。
axとはmatplotlibの基礎概念で「図表」のことをさします。axesとはその複数形です。
上記コードではplt.subplots()
で「白紙の図表20個」を作成した後で、axesをイテレーションしながら1つずつ白紙を埋めていくわけです。
私がこれまでに読んできたpython入門書(みんなのpythonやオライリーの機械学習本)では、この辺の「matplotlibの思想」的な部分が見えにくくなっていましたが、下記のチュートリアルをこなしておくとmatplotlibの全体像がスッキリと見えるのでおすすめです。ちなみに下記チュートリアルはmatplotlib公式からもリンクがあります。