Python 「matplotlib」や「seaborn」のグラフ内で日本語表示する

# '20/01/31更新:多少見易く書き直しました。

1⃣日本語フォントをpipでインストールする

pip install japanize-matplotlib

2⃣スクリプト内でそれをインポートする

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib

3⃣seabornの場合は更にフォント指定が必要です

sns.set()でfont="IPAexGothic"と引数指定をする。下記はその記述例です。

# 行列散布図を作成する関数
def plot_matrix_scatter(label, DF, my_color):
    sns.set(style="ticks", font_scale=1.2, palette=my_color, color_codes=True, font="IPAexGothic")
    g = sns.pairplot(DF, diag_kind="hist")
    g.fig.suptitle(label) #, fontsize=12)
    g.fig.subplots_adjust(top=0.9)
    plt.savefig(label + '.png')
    plt.close()

######################################
■本記事のプログラム実行例を下図に示します。以前の記事、Python ラテン超方格法などで水準表を作成する - HK29’s blogのコードを題材に、ファイル名やグラフタイトル、凡例などを日本語化しました。

f:id:HK29:20200131105100p:plain
f:id:HK29:20200131104802p:plain

f:id:HK29:20200131104820p:plain

■本プログラム例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import lhsmdu
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib

# 乱数を生成するメイン関数
def my_random_generater(my_factors, sampling_num):
    dimension = len(my_factors)
    factor_column_names = []
    for k in my_factors.keys():
        factor_column_names.append(k)
    print(factor_column_names)
    
    ##### Monte Carlo Sampling (MCS)
    monte_carlo = lhsmdu.createRandomStandardUniformMatrix(dimension, sampling_num)
    print("モンテカルロ サンプリング")
    print(monte_carlo)    
    print(sampling_num)
    
    fixed_data_np = my_calc(factor_column_names, monte_carlo)
    monte_carlo_DF = pd.DataFrame(fixed_data_np.T)
    monte_carlo_DF.columns = factor_column_names
    monte_carlo_DF.to_csv("01_モンテカルロ法.csv", sep=",", index=False, encoding="utf-8")
    plot_matrix_scatter("01_モンテカルロ法", monte_carlo_DF, "winter")
    
    ##### Latin Hypercube Sampling (LHS)
    latin_hypercube = lhsmdu.sample(dimension, sampling_num)
    print("ラテン超方格法 サンプリング")
    print(latin_hypercube)
    print(sampling_num)
    
    fixed_data_np = my_calc(factor_column_names, latin_hypercube)
    latin_hypercube_DF = pd.DataFrame(fixed_data_np.T)
    latin_hypercube_DF.columns = factor_column_names
    latin_hypercube_DF.to_csv("02_ラテン超方格法.csv", sep=",", index=False, encoding="utf-8")
    plot_matrix_scatter("02_ラテン超方格法", latin_hypercube_DF, "autumn")

    ##### Normal random Sampling
    buf=[]
    for cnt in range(dimension):
        buf.append(np.random.normal(0.5, 0.16, sampling_num))
    normal_random = np.array(buf)
    print("正規分布 サンプリング")
    print(normal_random)
    print(sampling_num)
    fixed_data_np = my_calc(factor_column_names, normal_random)
    normal_random_DF = pd.DataFrame(fixed_data_np.T, columns = factor_column_names)
    normal_random_DF.to_csv("03_正規分布.csv", sep=",", index=False, encoding="utf-8")
    plot_matrix_scatter("03_正規分布", normal_random_DF, "gray")

    ##### Beta random Sampling
    buf=[]
    for cnt in range(dimension):
        buf.append(np.random.beta(5, 2, sampling_num))
    beta_random = np.array(buf)
    print("ベータ分布 サンプリング")
    print(beta_random)
    print(sampling_num)
    fixed_data_np = my_calc(factor_column_names, beta_random)
    beta_random_DF = pd.DataFrame(fixed_data_np.T, columns = factor_column_names)
    beta_random_DF.to_csv("04_ベータ分布.csv", sep=",", index=False, encoding="utf-8")
    plot_matrix_scatter("04_ベータ分布", beta_random_DF, "summer")

    ##### plot graph
    x_name = "height"
    y_name = "width"
    
    myfont_size = 12
    ax = plt.figure(num=1, dpi=100).gca()
    '''
    ax.set_xlim(0, 1)
    ax.set_xticks(np.arange(0,1.1, 0.2))
    ax.set_ylim(0, 1)
    ax.set_yticks(np.arange(0,1.1, 0.2))
    '''
    ax.set_xlabel(x_name) #, fontsize=myfont_size)
    ax.set_ylabel(y_name) #, fontsize=myfont_size)
    ax.set_title('ランダム サンプリング') #, fontsize=myfont_size)

    xy_setting_facecolors_none(ax, "01_モンテカルロ法", monte_carlo_DF, x_name, y_name, "b")
    xy_setting(ax, "02_ラテン超方格法", latin_hypercube_DF, x_name, y_name, "r")
    xy_setting(ax, "03_正規分布", normal_random_DF, x_name, y_name, "k")
    xy_setting(ax, "04_ベータ分布", beta_random_DF, x_name, y_name, "g")

    #ax.set_aspect('equal', adjustable='box')
    plt.legend(loc = 'upper right',
               bbox_to_anchor = (1.1, 0.3), 
               borderaxespad = 0.,
               fontsize = myfont_size)
    plt.grid()
    #plt.show()
    plt.savefig('00_ランダム_サンプリング.png')
    plt.close()

# 区間0~1の乱数データを指定した最小値~最大値の区間へ変換する関数
def my_calc(factor_column_names, my_random_np_array):
    for i, key in enumerate(factor_column_names):
        my_min, my_max = my_factors[key]
        my_random_np_array[i] = ((my_max - my_min) * my_random_np_array[i] + my_min)
    fixed_data_np = np.array(my_random_np_array)

    return fixed_data_np

# 散布図を作成する関数(塗りつぶしなし)
def xy_setting_facecolors_none(ax, my_label, my_df, x_name, y_name, my_color):
    ax.scatter(my_df[x_name].values.tolist(), my_df[y_name].values.tolist(), 
               facecolors='none', edgecolors=my_color, label=my_label)

# 散布図を作成する関数
def xy_setting(ax, my_label, my_df, x_name, y_name, my_color):
    ax.scatter(my_df[x_name].values.tolist(), my_df[y_name].values.tolist(), 
               color=my_color, label=my_label)

# 行列散布図を作成する関数
def plot_matrix_scatter(label, DF, my_color):
    sns.set(style="ticks", font_scale=1.2, palette=my_color, color_codes=True, font="IPAexGothic")
    g = sns.pairplot(DF, diag_kind="hist")
    g.fig.suptitle(label) #, fontsize=12)
    g.fig.subplots_adjust(top=0.9)
    plt.savefig(label + '.png')
    plt.close()

if __name__ == "__main__":
    # parameter
    my_factors = {"height":(50, 200),
               "width":(0.06, 0.1),
               "density":(1e15, 9e15),
               "temp":(-50, 250)}
    sampling_num = 100
    
    # call function
    my_random_generater(my_factors, sampling_num)

以上

<広告>