強火で進め

このブログではプログラム関連の記事を中心に書いてます。

Code Interpreterで日本語を使ったグラフを作る方法

日本語部分が文字化けする

Code Interpreterでグラフを作った場合には日本語部分が文字化けして、俗に豆腐というこの表示→になります。

「これはOpenAI社がバージョンアップしてくれるのを待つしか無いかな?」という状況でした。しかし、この問題を上手い工夫により解決した人達が居ました。

という事で自分でも 試してみました。

試してみた

現在はCode Interpreterは3時間で25メッセージ(プロンプトの事で良いのかな?)までとの制限が有る為、送るメッセージは極力減らしたい所です。

これで行ける

試行錯誤の結果、必要なファイルはzipに固めて以下の様なプロンプトを記述すれば1回のメッセージで作成させる事に成功しました。

test.zipを解凍して以下のルールで棒グラフを描画して下さい。

- データは「data.csv」を使用
- フォントファイルは「NotoSansJP-Medium.ttf」を使用。font nameは「Noto Sans JP Medium」を使用。font familyは「Noto Sans JP Medium」を使用
- グラフのタイトルは「リンゴの販売数」
- グラフのx軸のラベルは「日付」
- グラフのy軸のラベルは「販売数」
- matplotlibで日本語を表示するためには追加の手順が必要な場合が有るとしても作業を進めて下さい。
- 作業中のコメントは日本語で出力

test.zipの中にはグラフ化したいデータのdata.csvとフォントファイルのNotoSansJP-Medium.ttfを入れました。 NotoSansJP-Medium.ttfは文字化けの豆腐をこの世から消し去りたいという想いから作られた無料で使用出来るフォントです。「No豆腐」からNotoという名前が付けられています。 ここからダウンロード出来ます。ダウンロードしたzipファイルには複数のフォントファイルが有るので自分の好きなファイルを使って下さい。

今回使用したdata.csvの内容はこちら。

日付,リンゴの販売数
2023/1/1,68
2023/1/2,65
2023/1/3,39
2023/1/4,133
2023/1/5,84

結果はこの様に日本語部分も正しく描画されました。

解説

Q: なぜ、zipファイル?
A: 一度に1つのファイルしかアップロード出来ない為

Q: 「matplotlibで日本語を表示するためには追加の手順が必要な場合が有るとしても作業を進めて下さい。」
A: ChatGPTから「matplotlibのフォント設定を調整します。ただし、matplotlibで日本語を表示するためには追加の手順が必要な場合があります。この点を承知して進めてよろしいでしょうか?」との質問が返されたため追加

Q: 「作業中のコメントは日本語で出力」
A: 何故か作業中のコメントが英語で出力された事が有ったので

※ChatGPTは同じプロンプトでも結果が異なる事が有るので今回のプロンプトの中から一部の記述が無くても正しく動作する事も有るかと思います。

ちょっと気になった所

以前、アップロードしたファイル

ChatGPTがzipファイルの展開処理を行っている部分の処理内容を表示した所、前にアップロードしたテスト.zipというファイルが残っているのが確認出来ました。この状態になっているという事はもし、「zipファイルを展開して全部の.csvファイルを元にグラフを作って」などと指示をすると以前アップロードしたファイルも処理の対象に含まれ、意図しない結果になりそうな気がします。
※最初はファイル名をテスト.zipと付けて検証していたのですがChatGPTが展開処理をした後に「文字化けしたので日本語ファイル向けの処理をします」と展開処理がもう一度実行されたので英語ファイル名を使う事にしました。

フォントファイルの指定

フォントファイルは「NotoSansJP-Medium.ttf」を使用というプロンプトでは上手く行かなかったのでfont nameは「Noto Sans JP Medium」を使用。font familyは「Noto Sans JP Medium」を使うを追加しました。

他のフォントファイルを使いたい場合にはCode Interpreterでフォントファイルをアップロードした状態で以下のプロンプトを入力するとfont namefont familyを取得出来ます。

このフォントファイルに対して以下の作業をして

- font nameを表示
- font familyを表示
- 作業中のコメントは日本語で出力

Pythonのプログラムが出来る人はfonttoolsモジュールがインストール済みの環境で以下のプログラムを実行すると確認できます。

from fontTools import ttLib

fontPath = 'NotoSansJP-Medium.ttf'
font = ttLib.TTFont(fontPath)
fontFamilyName = font['name'].getDebugName(1)
fullName= font['name'].getDebugName(4)

print("Font Family Name:", fontFamilyName)
print("Font Name:", fullName)