概要
Pythonで日本語を含むファイルを扱ったりグラフを書いたりしようとしたとき、初期設定ではうまく表示されないため、下手をすると数日間イライラすることになり時間がもったいないです。そもそもなぜこんなことになるかというと、主に以下4つの理由によるものと考えられます。ただし、本記事では細かい説明は省略し、日本語を使いたいモジュールごとに、具体的にどうしたらよいのかを説明していきます。
- (2系のみ)Pythonの標準エンコーダーが日本語に対応していないasciiである
- Python標準文字コード(utf-8)がExcel等で使う文字コード(shift-jis)と異なる
- Pythonで認識できる日本語フォントがPCにインストールされていない
- 主要モジュールの初期フォントが日本語に対応したフォントになっていない
対策集
Python2系のソースコード作成時
Python(2系)では、日本語データを変数に割り当てるとき、必ず頭文字にuを付けてください。
#必ずuを付ける word = u"文字"
uは「データをunicodeとして扱う」ということを意味します。指定しない場合、バイト文字列(str型)として扱われます。バイト文字列を画面表示したりする場合decodeが必要になります。2系ではdecodeにasciiが指定されているので普通に使おうとするとエラーが出ます。後ろにdecode(“utf-8”)を付ければ対策出来ますが、面倒なので頭にuを付けることをお勧めします。
#uを付けないときは後ろにdecode("utf-8")を付けて使う(非推奨) word = "文字" word.decode("utf-8")
pandasを使う場合
pandasがcsvデータを読み書きするときに使うread_csv及びto_csvは、デフォルトではutf-8を使います。Excelはshift-jisですので、このままだと文字化けや読み込みエラーが生じます。そのため、文字コードを以下のように明示的に指定しましょう。
#Excelで作ったcsvデータを読み込むときは文字コードに"cp932"を指定 df = pd.read_csv("indata.csv", encoding="cp932") #出力したデータをExcelで読みたいときも文字コードに"cp932"を指定 df.to_csv("outdata.csv", encoding="cp932") #xlsxの場合も同様 df = pd.read_excel("indata.xlsx", encoding="cp932")
matplotlibを使う場合
matplotlibを使うときに日本語がよく□になってしまいますが、これはフォントが日本語に対応していないことが原因です。というわけでフォントに日本語を指定したいところですが、matplotlibではttc拡張子のフォントしか取り扱ってくれないので、webからダウンロードしインストールしましょう。例えばIPAフォントのダウンロード等が使えます。
インストールしたらC直下に行き、AnacondaフォルダからLib→site-packages→matplotlib→mpl-dataと辿り、matplotlibrcをメモ帳等で開きましょう。このファイルはmatplotlibの各種項目の初期設定を指定するファイルです。文末にfont.family:ダウンロードしたフォントを記載すれば対応完了です。
・・・ #animation.mencoder_args: '' # Additional arguments to pass to mencoder #animation.convert_path: 'convert' # Path to ImageMagick's convert binary. # On Windows use the full path since convert # is also the name of a system tool. font.family : IPAexGothic #ダウンロードしたフォントをmatplotlibrcの末尾に追加
設定してもうまくいかないときは以下を試してみてください。
- Pythonの再起動
- フォント名の綴りが合っているか(IPAGothic等。間違っていてもエラーは出ませんので注意。使えるフォント名は.matplotlibというフォルダの中のfontList.jsonをメモ帳で開けば確認できます。)
- ユーザーフォルダ等にある[.matplotlib]というフォルダを探し中のキャッシュファイルを削除
seabornを使う場合
seaborn綺麗なグラフを書きたいときに使えるモジュールですが、やはり日本語に対応していません。上と同様にttc形式のフォントをインストール後、C直下に行き、AnacondaフォルダからLib→site-packages→seabornと辿り、中にあるrcmod.pyというファイルを開きましょう。このファイルはseabornの設定項目が指定されており、sans-serifとなっている部分を2か所、日本語フォント名に変更しましょう。
・・・ def set(context="notebook", style="darkgrid", palette="deep", font="IPAGothic", font_scale=1, color_codes=False, rc=None): #1つ目 ・・・ "image.cmap": "Greys", "font.family": ["IPAGothic"], #2つ目 "font.sans-serif": ["Arial", "Liberation Sans", "Bitstream Vera Sans", "sans-serif"], ・・・
設定してもうまくいかないときはPythonを再立ち上げしましょう。なお、rcmod内でsans-serifと書かれている部分は上記以外にもありますが、上記以外は変更しないようにしましょう。
sklearn.treeを使う場合
scikitlearn.treeで決定木分析を実施し、graphvizで決定木グラフを書きたいとき、やはり日本語に対応していない問題に直面します。上と同様にttc形式のフォントをインストール後、C直下に行き、AnacondaフォルダからLib→site-packages→sklearn→treeと辿り、中にあるexport.pyというファイルを開きましょう。このファイルは名前の通りグラフ出力に使うモジュールでfontnameにhelveticaとなっている部分を2か所、日本語フォント名に変更しましょう。詳しくは以下の記事を参考にしてください。
まとめ
Pythonは覚えやすく様々な用途に使える言語ですが日本語の取り扱いに関してはかなりネックです(勿論、大抵の言語で多かれ少なかれそういう傾向はありますが)。いろいろなサイトを辿ると対策が書いてあるのですが、人にPythonを紹介する時に、「モジュールごとに対策がまとまっていたらいいのになぁ」と思ったので、自分で書いてみました。皆様のPythonライフに貢献できると幸いです。
- 2系のソースコードで日本語を書くときは頭にuを付ける
- pandasとExcelデータを結びつけるためにはencoding=”cp932″を指定
- matplotlibを使うときは日本語フォントのダウンロード+matplotlibrcにフォントを記載
- seabornを使うときは日本語フォントのダウンロード+rcmod.pyにフォントを記載
- sklearn.treeを使うときは日本語フォントのダウンロード+export.pyにフォントを記載
おかげでmatplotlibで日本語を表示することができました。
良かったです!