出版日: 2024年6月14日
Matplotlibで日本語文字が正しく表示されないという問題に遭遇したことはありますか?
この醜い問題について話しています:
上記のグラフは、タイトル、x軸およびy軸のラベルに日本語文字を使用しています。Pythonで使用されるデフォルトフォントは日本語文字をサポートしていないため、文字が正しく印刷されていません。
プログラムが文字を印刷できないたびに、厄介な警告メッセージが表示されます:
これはプログラマーの悪夢です。
ちなみに、上記のプログラムは以下のコードで作成されています。
import numpy as np
import matplotlib.pyplot as plt
rand_array = np.random.randint(10, size=20)
plt.figure(figsize=(10, 6))
plt.plot(rand_array)
plt.title("晴耕雨読")
plt.ylabel("前人未踏")
plt.xlabel("率先垂範")
plt.show()
この問題を解決しましょう。
デフォルトフォントが日本語文字を印刷できないため、日本語文字をサポートするフォントにデフォルトフォントを変更する必要があります。
デフォルトフォントが何かを確認しましょう:
import matplotlib
# Get font family
print(matplotlib.rcParams["font.family"])
# >> ['sans-serif']
# Get fonts within the family
matplotlib.rcParams["font.sans-serif"]
# >> ['DejaVu Sans', 'Bitstream Vera Sans', 'Computer Modern Sans Serif', 'Lucida Grande', 'Verdana', 'Geneva', 'Lucid', 'Arial', 'Helvetica', 'Avant Garde', 'sans-serif']
残念ながら、現在のフォントは日本語文字をサポートしていませんが、解決策は非常に簡単です。
matplotlibはデフォルトでsans-serif
フォントファミリーを使用していますが、日本語をサポートするものを含む多くのフォントが使用可能です。
それらをリストアップしましょう:
import matplotlib
fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
len(fonts), fonts
# >> (303, {'.Aqua Kana', '.Keyboard', '.New York', '.SF Arabic', '.SF Compact', '.SF Compact Rounded', ...
2021年モデルのMacBook Proを使用しており、これが利用可能なフォントです。使用するマシンによって異なるフォントセットが得られる場合があります。
では、実際に日本語をサポートしているフォントを見てみましょう:
import matplotlib
# Matplitlib gives warning when a character cannot be plotted with a font
# We need to escalate it to error so that we can catch it
import warnings
warnings.filterwarnings("error")
# Get all fonts in the OS
fonts = set([f.name for f in matplotlib.font_manager.fontManager.ttflist])
# Initialize a list where we'll keep Japanese compatible fonts
jp_compatible_fonts = []
for i, font in enumerate(fonts):
# Try plotting a text that says: XXフォントが日本語をサポートしているので、大好き!
# Fonts that don't support Japanese will give error
try:
fig = plt.figure(figsize=(0.5,0.5))
plt.text(0, 0, f"{font}フォントが日本語をサポートしているので、大好き!", fontname=font)
plt.axis('off')
plt.draw()
plt.pause(0.001)
# If successfully plotted, add it to the list
jp_compatible_fonts.append(font)
except UserWarning:
pass
# Close the figure so that incompatible font does not influence the next plot
plt.close(fig)
jp_compatible_fonts
# >> ['Apple SD Gothic Neo', 'Hiragino Mincho ProN', 'Arial Unicode MS', 'Heiti TC', 'Hiragino Maru Gothic Pro', 'Hiragino Sans GB', 'Hiragino Sans', 'PingFang HK', '.Aqua Kana']
私のラップトップでは、日本語を問題なくプロットできるフォントが9つありました:
これらのフォントが実際に日本語をどのようにプロットするか見てみましょう:
import matplotlib
fig = plt.figure()
for i, font in enumerate(jp_compatible_fonts):
plt.text(
0,
i,
f"{font}フォントが日本語をサポートしているので、大好き!",
fontname=font,
)
plt.axis("off")
plt.ylim(0, len(jp_compatible_fonts))
plt.show()
以下が結果です:
これまでのところ、Matplotlibのデフォルトフォントが日本語文字をプロットできないことが分かりましたが、日本語を問題なくプロットできるフォントが他に9つあることが分かりました。では、元のチャートに戻りましょう。
しかし、チャートを描く前に、デフォルトフォントを先ほど特定した9つのフォントのいずれかに変更しましょう。
個人的にはヒラギノ角ゴシック
が好きなので、このフォントに変更します。
import numpy as np
import matplotlib.pyplot as plt
### CHANGE THE FONT FROM DEFAULT TO HIRAGINO SANS
plt.rcParams['font.family'] = "Hiragino Sans"
rand_array = np.random.randint(10, size=20)
plt.figure(figsize=(10, 6))
plt.plot(rand_array)
plt.title("晴耕雨読")
plt.ylabel("前人未踏")
plt.xlabel("率先垂範")
plt.show()
以下が結果です:
日本語文字が美しく表示され、厄介な警告も表示されなくなりました。
このブログ記事では、Matplotlibでの日本語文字表示の問題を解決しました。1行のコードを追加するだけで問題が解決する美しい解決策です。
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "Hiragino Sans"
ポイントは、日本語をサポートしないデフォルトフォントを使用するのをやめ、実際にサポートするフォントに切り替えることです。例えば、私のマシンにすぐに利用可能だったヒラギノ角ゴシックのように。
このブログ記事を楽しんでいただけたでしょうか。ご質問やコメントがあれば、以下にお知らせください。
次のお知らせまで、ハッキングを楽しんでください!
このブログは英語からChatGPTによって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。
コメントを残す
コメント
その他のブログ
2024/06/19
SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する
2024/06/17
JavaScriptを用いて東京都のインタラクティブな地図を作成する
2024/06/13
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル
2024/06/07
日本語で最もよく使われる3000字の漢字
2024/06/07
VSCodeでRegexを使用してReplaceする方法
2024/06/06
SvelteではReadable Storeを使用するな
2024/06/05
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法
2024/05/31
JavaScriptを使用してWebページ上でマウスが指している単語を特定する
2024/05/29
SvelteとSVGを用いてインタラクティブな地図を作成する
2024/05/28
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ
2024/05/27
Javascriptを使用して数独を解く方法
2024/05/26
ウェブサイトへのトラフィックを1か月で10倍に増やした方法
2024/05/24
人生はサイクリングに似ている
2024/05/19
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する
2024/05/16
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか
2024/05/15
PythonとGitフックを使用してサイトマップを自動的に生成する
2024/05/14
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン
2024/05/13
SvelteとSvelteKitはなんですか?
2024/05/12
SvelteKitで国際化(多言語化)
2024/05/11
SvelteでCachingを用いてDeploy時間を短縮する方法
2024/05/10
SvelteとIntersection Oberverによるレイジーローディング
2024/05/10
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法
2024/05/09
Pythonを用いてShapeFileをSVGに変換できる方法
2024/05/08
Svelteの反応性:変数、バインディング、およびキー関数
2024/05/07
書評 | 孫子の兵法
2024/05/06
スペシャリストは終了。ゼネラリスト万歳!
2024/05/03
トルコ人の有権者の投票行動をPythonでの分析
2024/05/01
Seleniumを用いてトルコ投票データベースを作る方法
2024/04/30
SvelteとTailwindを使用してInfinite Scrollできる方法
2024/04/29
1年間以内で日本語を駆使できるようになるための方法
2024/04/25
SvelteとTailwindを用いたWebサイトテンプレート
2024/01/29
怠惰なエンジニアとひどいデザイン
2024/01/28
偉大さについて
2024/01/28
MacBook で PDF を PNG に変換する
2023/12/31
2023年振り返り:24冊の読んだ本のまとめ
2023/12/30
Python PILを使用して写真コラージュを作成する方法
2024/01/09
ウェブサイトの訪問者のデバイスとブラウザを検出する方法
2024/01/19
ChatGPT回答の解析