文芸船

matplotlibで描くべつやくメソッド

はじめに

 2007年にべつやくれい氏が「円グラフで表そう」で公開した、円グラフで気持ちを表現するべつやくメソッドについて、10年以上を経てこれをそのままやってくれるサービスが見当たらなくなりました。フォントは後付けもあるとして、手書き風の円グラフ、それも現代的にSVGで探したところ、matplotlibでできることがわかりました。本ページはその備忘録的なページです。なお、主な参考ページは後ろにまとめて記載しておきます。また、全てMacで作業しています。

ツール関係のインストール

フォントのインストール

 Macでプリインストールされているフォントではまともに日本語が表示できない。AppleGothicを推奨しているWebサイトもあるが、「気」など常用漢字の範囲すら表示できないので非実用的だ。そこで表示可能な「IPAフォント」を独立行政法人情報処理推進機構のWebサイトからインストールする。この他にも「衡山毛筆フォント行書」「Noto Serif」なども使える。

 なお、先にフォントをインストールしている方がトラブルは起きにくい様子。

Homebrewのインストール

  1. XcodeをApp Storeからインストールする。6GBもあるので容量、時間ともにかなり食う覚悟が必要。
  2. Homebrewをターミナルでインストールする。Homebrew macOS 用パッケージマネージャーのページにあるスクリプトを貼り付けて実行する。
  3. Homebrewがインストールされたら、brew updatebrew upgradeを実行し、Homebrewを最新にする。

Python3とmatplotlibのインストール

brew install python3
pip3 install --upgrade setuptools
pip3 install --upgrade pip
brew install freetype
pip3 install matplotlib

使用可能なフォントの確認・再構築

 下記で使えるフォント一覧が出るので、最初にインストールしたフォントが使えるか確認する。

python3
>>> import matplotlib.font_manager as fm
>>> fm.findSystemFonts()

 表示されない場合は、下記でキャッシュを削除する。(ここは色々な方法があるようです。)

matplotlib.font_manager._rebuild()

Pythonコード

 上記の準備ができたら、ようやくmatplotlibでグラフの描画スクリプトを書ける。今回はべつやくメソッドで円グラフなので、下記は基本は円グラフのスクリプトとなる。なお、普通の円グラフと手書き風円グラフの切替、単純に表示させる場合とファイル出力の切替をできるようにした。なお、出力される手書き風円グラフはPath要素で構成されファイルサイズが大きいことから、最終的にはSVGZにする必要があるかもしれない。

import matplotlib.pyplot as plt
print('手書き風にしますか? [y/n]')
str1 = input()
if str1 == 'y':
    plt.xkcd()
else:
    pass
font = {'family': 'IPAexGothic'}
plt.rc('font', **font)
data = [45, 15, 15, 20, 5]
labels = ['ねずみ', 'うし', 'とら', 'うさぎ', 'たつ']
colors = ['yellowgreen', 'gold', 'red', 'lightskyblue', 'lightcoral']
plt.figure(figsize=(7, 6))
plt.pie(data, labels=labels, colors=colors, autopct='%1.1f%%', startangle=270)
plt.axis('equal')
print('SVGで保存しますか? [y/n]')
str2 = input()
if str2 == 'y':
    plt.savefig('piechart.svg')
elif str2 == 'n':
    plt.show()
else:
    print('処理を中止しました。')

LibreOffice6.0の謎

 ラベルの折り返し等で不満があったので、できた後のSVGを再編集することにした。SVGと言えばinkscapeが有名だが、ちょっとした使用には重い。そこでLibreOfficeでtext要素での文字記入のみ行ったところお手軽だった。

 ただしテキストエディタで確認したところ、Versionが1.2になっていた。(1.2は問題が起きて未勧告。)また、無駄なタグ、要素及びclass属性が見つかった。自動の圧縮ソフト等では削除されないので手作業が必要かもしれない。

文芸船profile & mail