アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

matplotlibを日本語化して、python+matplotlib_vennでベン図を描画してみよう

matplotlibで、日本語表示ができるようにします。

ついでに設定の確認をかねて、matplotlib_vennを使って、集合でお馴染みのベン図を書いてみます。 

 

matplotlibの日本語化

日本語化と言っても、単にフォントを日本語フォントにする・・というだけです。

matplotlibのデフォルトはsans-selfなので、日本語は表示できません。

さて、やってみます。

日本語フォントを手にいれます。

窓の杜からダウンロードできます。

forest.watch.impress.co.jp

ダウンロードして解凍します。

ipaexg.ttf (ゴシック)

ipaexm.ttf (明朝)

の2ファイルがコピー対象のフォントファイルです。

 

フォントファイルをコピーするフォルダを確認

上記のフォントファイルを、matplotlibのフォントフォルダにコピーするのですが、環境によって違うので、普通に探すのは大変です。

とりあえず、pythonのプログラムで確認します。

import matplotlib as mplt

print(mplt.matplotlib_fname())

これで設定ファイルのパスと設定ファイル名が表示されます。

こんな感じですね。 

C:\.........\Anaconda3\lib\site-packages\matplotlib\mpl-data\matplotlibrc

この「matplotlibrc」が設定ファイルなので、その前「mpl-data」までが目的のパスです。

エクスプローラでそのパスに行くと、fontsフォルダがあり、その下に「ttf」フォルダがあります。

そこに解凍したフォントファイルをコピーします。

 

設定ファイルに追加したフォントを追記する

 

上記フォルダの「matplotlibrc」が設定ファイルです。

これをエディタで開いて以下の部分を探します。

#font.family : sans-serif

この下に以下を追記します。

font.family : IPAexGothic
#font.family : IPAexMincho

上がゴシック。

下が明朝です。

今回はゴシックを使うので、ゴシックのコメントをはずしてます。

明朝の場合は逆にします。

ただ、自分は明朝を普段使っていません。

なので、直近で動作確認できてるわけではありません。

動作確認済で確実な方がよければ、上記と同じゴシックにしてください。

 

フォントキャッシュを削除する

上記でフォントの設定はできたのですが、ちょっと落とし穴があります。

それはフォントキャッシュの存在です。

いくら設定を変更しても、フォントキャッシュが残っている限り、matplotlibはフォントを変更してくれないみたいなのです。

なので、フォントキャッシュを消します。

といっても、どこにあるかわからないので、Pythonのプログラムで探します。

import matplotlib as mplt

print(mplt.get_configdir())

これで表示されたフォルダを開きます。

C:\Users\・・・・・\.matplotlib

 隠しファイルなので、エクスプローラの設定によっては表示されない場合もあるので、そのへんは調整してください。

このフォルダにある「fontList.json」がフォントキャッシュファイルなので、これを消します。

 

設定がうまくいったか確認します

上記までやったらOKです。

念のため、pythonのプログラムで確認してみます。

import matplotlib as mplt

print(mplt.rcParams['font.family'])

これで「IPAexGothic」とか設定した名称が表示されていれば設定OKです。

 

ベン図を描いてみる

 

せっかく日本語化したので、集合(set)を使ってベン図を書いてみます。

ベン図をPythonで描くには、matplotlib以外に、matplotlib_vennが必要です。

Anacondaにもデフォルトでははいってないので、インストールします。

pip install matplotlib-venn

matplotlib_vennのチュートリアルはこちらにあります。

pypi.org

英語ですけど、たぶん、見たらわかります。

さて、やってみます。

想定として。

なんかのアンケートをとったとしてみます。

例えば、次の選択肢であなたが3年以上の経験のある球技は?という設問。

選択肢は3つ。

にしてみます。

まあ、かなりわざとらしいですが。

まず、2つの集合(s1、s2)のベン図です。

from matplotlib_venn import venn2
import matplotlib.pyplot as plt

def draw_venn2(sets,labels):
    venn2(subsets=sets,set_labels=labels)
    plt.show()
    
s1 = set(['a','b','c','d'])
s2 = set(['e','f','g','a','c'])
draw_venn2([s1,s2],['サッカー','野球'])

表示されたベン図はこちら。 

 

f:id:arakan_no_boku:20181118234111j:plain

日本語がちゃんと表示されてます。

続けて、3つの集合のベン図です。

from matplotlib_venn import venn2,venn3
import matplotlib.pyplot as plt

def draw_venn3(sets,labels):
    venn3(subsets=sets,set_labels=labels)
    plt.show()

s1 = set(['a','b','c','d'])
s2 = set(['e','f','g','a','c'])
s3 = set(['a','c','z','y','x'])
draw_venn3([s1,s2,s3],['サッカー','野球','ラグビー'])

ベン図はこちら 

f:id:arakan_no_boku:20181118234322j:plain

よしよし。

OKですね。