Macのmatplotlibで日本語を含むグラフPDFが文字化け
追記:新しい記事で文字化けが起こるフォントを確認し解決策を書きました。こちらを参照して下さい。
matplotlibはPythonの定番グラフ描画ライブラリーである。私の暮らしを支える文字通りの生活必需品であるが、macOSをversion 13 Venturaにアップデートして以来、日本語フォントを含むグラフをPDFに保存するとAdobe Acrobat Readerで文字化けするようになってしまった。プレビュー.appでは正常に見えるので、気付かぬまま他人に共有する危険がある。フォントの紐付けが破綻しているのだろうか。半角文字も化けるところを見るとシステムフォントへのフォールバックもない。なお、本件はPDFに保存してAcrobat Readerで開いたときにのみ見られる現象であり、日本語フォントを設定していないためグラフの文字が豆腐になる問題とは異なる。
試行錯誤の結果、弥縫策だがAffinity Publisher 2で書き出すと修復できることがわかった。
環境
macOS 13.0.1, Python 3.9.13 , Pandas 1.5.2, matplotlib 3.6.2
うまくいった方法
- matplotlibでPDF保存→Affinity Publisher 2で開いてPDFに書き出す。
- matplotlibでPDF保存→Acrobat Proで開き「PDFを編集」モードで化けた文字列を選択して日本語フォントを指定する。日英フォントが混在していると一括で設定できないので辛い。
うまくいかなかった方法
- ターミナルから
rm -f ~/.matplotlib/*
と入力してmatplotlibのフォントキャッシュを削除する。 - matplotlibでPDF保存→プレビュー.appでPDFに書き出す:プレビューで正しく表示されるがAcrobat Readerで化けるファイルが再生産される。
- matpotlibでPS保存→プレビュー.appでPDFに変換する:そもそもプレビューでPSファイルを開けない。昔は開けた気がするがなあ。
- matpotlibでPS保存→Acrobat ProでPDFに変換する:Distillerのログは
%%[ Error: invalidfont; OffendingCommand: findfont ]%%
とな。
グラフのスクリプト
import pandas as pd
from matplotlib import pyplot as plt
from matplotlib import rcParams
url= "https://www.stat.go.jp/data/cpi/2020/youshiki/csv/zmi2020s.csv" # 注
cpi = (pd.read_csv(url,
encoding="cp932",
skiprows=[1, 2, 3, 4, 5],
usecols=["類・品目", "総合"])
.assign(date=lambda df:
pd.to_datetime(df["類・品目"].astype("str"),
format="%Y%m"))
.drop("類・品目", axis=1)
.set_index("date")
["総合"]
)
rcParams["axes.spines.top"] = False
rcParams["axes.spines.right"] = False
rcParams["font.family"] = "Hiragino Sans"
rcParams["pdf.fonttype"] = 42
fig, ax = plt.subplots()
cpi.plot(
ax=ax,
title="2020年基準消費者物価指数",
legend=False,
ylim=[0, 110],
xlabel="年",
ylabel="消費者物価指数"
)
fig.savefig("cpi.pdf")
注:2022年12月7日現在総務省統計局の2020年基準消費者物価指数結果表一覧ページからダウンロードされるファイルはCSVなのに何故か拡張子がxlsになっていて、実はこのコードでは読み込めない。
“Macのmatplotlibで日本語を含むグラフPDFが文字化け” に対して1件のコメントがあります。