44022


以下のpythonスクリプト

[code]

    import numpy as np
    import matplotlib
    import matplotlib.pyplot as plt
    import datetime
    import matplotlib.dates as dates
    
    hours = (( datetime.datetime(2010,8,31,22) - datetime.datetime(2010,7,1,0) ).days + 1) * 24
    dates_list = [datetime.datetime(2010,7,1) + datetime.timedelta(hours=i) for i in range(1,hours)]
    
    fig = plt.figure(figsize=(12,8))
    ax1 = fig.add_subplot(1,1,1)
    
    #軸の設定
    ax1.set_xlabel('time')
    ax1.xaxis.set_major_locator(dates.DayLocator(interval=5))　#5日間隔に指定
    ax1.xaxis.set_major_formatter(dates.DateFormatter('%d%b\n%Y')) #x軸のフォーマットを指定
    
    #plot
    aaa = np.ones(len(dates_list))　#適当なデータ
    ax1.plot(dates_list,aaa)
    plt.show()
    
[/code]

を実行すると以下の図のようにx軸のDateformatの%bの部分が文字化け(？)しています．英語表記(Jan,Feb,...)に直すにはどうしたらいいでしょうか？

実行環境はpython3.5 (on anaconda), matplotlibはver.2.1.0になります．

[![結果の図](https://i.stack.imgur.com/jJVp7.png)](https://i.stack.imgur.com/jJVp7.png)


CC BY-SA 4.0
2018-05-16T11:13:44.847
44020
2018-05-17T10:28:32.900
2018-05-17T02:44:16.353
26604
26604
question
python python3 matplotlib
matplotlib.datesのdates.DateFormatter('%b')が文字化けする


`dates.DateFormatter('%d%b\n%Y')`の`%b`はロケールの月名の短縮形なので、localeが日本語になっていると、`6月`のように`月`がついて表示されます。その場合matplotlib
はデフォルトでは日本語フォントに対応していないので`□`いわゆる`豆腐`になってしまいます。

英語表記(Jan,Feb,...)にしたい場合は、locale
を英語に変更する必要があるので、スクリプトの最初の部分に以下を追加するようにします。ただし、英語の言語パッケージがインストールされている必要があります。

[code]

    import locale
    locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
    
[/code]

また、`FuncFormatter`を使うことでlocale関係なくカスタマイズすることが可能です。今回のケースであれば以下のようなスクリプトを追加すると英語表記にできます。（[公式マニュアル](https://matplotlib.org/api/ticker_api.html?highlight=ticker)）

[code]

    from matplotlib.ticker import FuncFormatter
    
    MONTH_NAME = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    
    def dateFormatter(x, pos):
       dt = datetime.date.fromordinal(int(x))
       return '{0:02d} {1}\n{2}'.format(dt.day, MONTH_NAME[dt.month - 1], dt.year)
    
    formatter = FuncFormatter(dateFormatter)
    ax1.xaxis.set_major_formatter(formatter) #x軸のフォーマットを指定
    
[/code]

なお、`6月29日`のように日本語で表示させたい場合は、matplotlibの日本語の表示について、Qiita の方に書いたので、そちらを見てください。

<https://qiita.com/yniji/items/3fac25c2ffa316990d0c>


CC BY-SA 4.0
2018-05-16T13:19:05.460
44022
2018-05-17T10:28:32.900
2018-05-17T10:28:32.900
15171
15171
44020
answer