Matplotlibで日本語文字化けを解決できる簡単な方法

出版日: 2024年6月14日

Matplotlibで日本語文字化けを解決できる簡単な方法

背景

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つありました:

  • Apple SD Gothic Neo
  • ヒラギノ明朝 ProN
  • Arial Unicode MS
  • Heiti TC
  • ヒラギノ丸ゴ Pro
  • ヒラギノ角ゴシック GB
  • ヒラギノ角ゴシック
  • PingFang HK
  • .Aqua Kana

これらのフォントが実際に日本語をどのようにプロットするか見てみましょう:

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によって翻訳されました。不明な点がある場合は、お問い合わせページからご連絡ください。

コメントを残す

コメント

その他のブログ

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

2024/06/19

SvelteとJavaScriptを使用してシンプルで動的なツールチップを作成する

JavaScriptSvelteTooltip動的シンプルツールチップフロントエンド
JavaScriptを用いて東京都のインタラクティブな地図を作成する

2024/06/17

JavaScriptを用いて東京都のインタラクティブな地図を作成する

SvelteSVGJavaScriptTailwindインタラクティブな地図東京市区町村23区地図
書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

2024/06/13

書評 | トーキング・トゥ・ストレンジャーズ 「よく知らない人」について私たちが知っておくべきこと by マルコム・グラッドウェル

書評トーキング・トゥ・ストレンジャーズ「よく知らない人」について私たちが知っておくべきことマルコム・グラッドウェル
日本語で最もよく使われる3000字の漢字

2024/06/07

日本語で最もよく使われる3000字の漢字

3000よく使う準漢字使用回数漢字日本語漢字リスト漢字普及率日本語能力試験独学勉強単語
VSCodeでRegexを使用してReplaceする方法

2024/06/07

VSCodeでRegexを使用してReplaceする方法

VSCodeRegex検索置き換える条件付き置換FindReplaceConditional Replace
SvelteではReadable Storeを使用するな

2024/06/06

SvelteではReadable Storeを使用するな

SvelteReadableWritableステート管理ストアStore速度メモリファイルサイズ
GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

2024/06/05

GzipとPakoでデータを圧縮してWebサイトのローディング速度を上げる方法

Gzip圧縮PakoWebサイトローディング速度SvelteKit
JavaScriptを使用してWebページ上でマウスが指している単語を特定する

2024/05/31

JavaScriptを使用してWebページ上でマウスが指している単語を特定する

JavascriptマウスPointerHoverWeb開発
SvelteとSVGを用いてインタラクティブな地図を作成する

2024/05/29

SvelteとSVGを用いてインタラクティブな地図を作成する

SvelteSVGインタラクティブな地図フロントエンド
書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

2024/05/28

書評 | Originals 誰もが「人と違うこと」ができる時代 by アダム・グラント & シェリル・サンドバーグ

書評Originals誰もが「人と違うこと」ができる時代アダム・グラント & シェリル・サンドバーグ
Javascriptを使用して数独を解く方法

2024/05/27

Javascriptを使用して数独を解く方法

数独を解くアルゴリズムJavaScriptコーディング
ウェブサイトへのトラフィックを1か月で10倍に増やした方法

2024/05/26

ウェブサイトへのトラフィックを1か月で10倍に増やした方法

ウェブサイトへのトラフィック増加クリックインプレッションGoogle Search Console
人生はサイクリングに似ている

2024/05/24

人生はサイクリングに似ている

サイクリング人生哲学成功
JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

2024/05/19

JavaScriptでバックトラッキング・アルゴリズムを用いて完全な数独グリッドを生成する

数独バックトラッキング・アルゴリズム完全なグリッドJavaScript
Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

2024/05/16

Tailwindが素晴らしい理由とWeb開発をいかに楽にするか

Tailwind素晴らしいフロントエンドWeb開発
PythonとGitフックを使用してサイトマップを自動的に生成する

2024/05/15

PythonとGitフックを使用してサイトマップを自動的に生成する

GitフックPythonサイトマップSvelteKit
書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

2024/05/14

書評 | Range (レンジ) 知識の「幅」が最強の武器になる by デイビッド・エプスタイン

書評Range (レンジ)David Epstein (デイビッド・エプスタイン)知識の「幅」が最強の武器になる
SvelteとSvelteKitはなんですか?

2024/05/13

SvelteとSvelteKitはなんですか?

SvelteSvelteKitFront-endVite
SvelteKitで国際化(多言語化)

2024/05/12

SvelteKitで国際化(多言語化)

国際化多言語SvelteKitI18N
SvelteでCachingを用いてDeploy時間を短縮する方法

2024/05/11

SvelteでCachingを用いてDeploy時間を短縮する方法

SvelteEnhanced ImageCachingDeploy Time
SvelteとIntersection Oberverによるレイジーローディング

2024/05/10

SvelteとIntersection Oberverによるレイジーローディング

レイジーローディングウェブサイト速度の最適化SvelteIntersection Observer
遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

2024/05/10

遺伝的アルゴリズムで最適な株式ポートフォリオを作る方法

株式書状ポートフォリ最適化遺伝的アルゴリズムPython
Pythonを用いてShapeFileをSVGに変換できる方法

2024/05/09

Pythonを用いてShapeFileをSVGに変換できる方法

ShapeFileSVGPythonGeoJSON
Svelteの反応性:変数、バインディング、およびキー関数

2024/05/08

Svelteの反応性:変数、バインディング、およびキー関数

Svelte反応性バインディングキー関数
書評 | 孫子の兵法

2024/05/07

書評 | 孫子の兵法

書評The Art Of War (兵法)Sun Tzu (孫子)Thomas Cleary
スペシャリストは終了。ゼネラリスト万歳!

2024/05/06

スペシャリストは終了。ゼネラリスト万歳!

専門家ジェネラリストパラダイムシフトソフトウエア・エンジニアリング
トルコ人の有権者の投票行動をPythonでの分析

2024/05/03

トルコ人の有権者の投票行動をPythonでの分析

トルコ投票者年齢分析国家投票有権者行動分析
Seleniumを用いてトルコ投票データベースを作る方法

2024/05/01

Seleniumを用いてトルコ投票データベースを作る方法

PythonSeleniumWeb Scrapingトルコ国家投票
SvelteとTailwindを使用してInfinite Scrollできる方法

2024/04/30

SvelteとTailwindを使用してInfinite Scrollできる方法

SvelteTailwindInfinite ScrollFront-end
1年間以内で日本語を駆使できるようになるための方法

2024/04/29

1年間以内で日本語を駆使できるようになるための方法

日本語短時間言語学習日本語能力試験ビジネス日本語
SvelteとTailwindを用いたWebサイトテンプレート

2024/04/25

SvelteとTailwindを用いたWebサイトテンプレート

Web開発フロントエンドSvelteTailwind
怠惰なエンジニアとひどいデザイン

2024/01/29

怠惰なエンジニアとひどいデザイン

怠け者エンジニア質の悪い製品StarbucksSBI証券
偉大さについて

2024/01/28

偉大さについて

雄大さ人生の意味満足できる人生目的
MacBook で PDF を PNG に変換する

2024/01/28

MacBook で PDF を PNG に変換する

PDFPNGMacBookAutomator
2023年振り返り:24冊の読んだ本のまとめ

2023/12/31

2023年振り返り:24冊の読んだ本のまとめ

読書 2023振り返り
Python PILを使用して写真コラージュを作成する方法

2023/12/30

Python PILを使用して写真コラージュを作成する方法

PythonPIL画像処理コラージュ
ウェブサイトの訪問者のデバイスとブラウザを検出する方法

2024/01/09

ウェブサイトの訪問者のデバイスとブラウザを検出する方法

Javascript端末検知ブラウザ検知Website分析
ChatGPT回答の解析

2024/01/19

ChatGPT回答の解析

ChatGPT大規模言語モデル機械学習生成AI