matplotlibでグラフのX軸のメモリラベルを装飾する

TAGS :

テスト用のグラフの描画

まずは、グラフを用意します。棒グラフでも折れ線グラフでもいいです。
折れ線グラフを デモサイト を参考に描画します。
あと、matplotlib.axes.Axes.plot のドキュメント も参考にします。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
ax.plot(names, values, linewidth=2.5, marker='o')

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_a.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

このような折れ線グラフが出力されます。
折れ線グラフ

ラベルに日本語を使う

ax.set_xticklabels() を使って、メモリのラベルを日本語にしてみます。
必要な場合は、matplotlib.axes のドキュメント も見てください。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
ax.plot(names, values, linewidth=2.5, marker='o')

print(ax.get_xticklabels())
ax.set_xticklabels(['りんご', 'オレンジ', 'レモン', 'ライム'])
print(ax.get_xticklabels())

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_b.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

日本語うんぬんの前に、ここのコードの実行時にワーニングが出ています。


print(ax.get_xticklabels())
ax.set_xticklabels(['りんご', 'オレンジ', 'レモン', 'ライム'])
print(ax.get_xticklabels())

ワーニングは UserWarning: FixedFormatter should only be used together with FixedLocator です。
この指摘は、最初の ax.get_xticklabels() の出力を見ると、ラベルを書く tick location がすべて0になっているからです。


[Text(0, 0, ), Text(0, 0, ), Text(0, 0, ), Text(0, 0, )]
UserWarning: FixedFormatter should only be used together with FixedLocator
ax.set_xticklabels(['りんご', 'オレンジ', 'レモン', 'ライム'])
[Text(0, 0, 'りんご'), Text(1, 0, 'オレンジ'), Text(2, 0, 'レモン'), Text(3, 0, 'ライム')]

このようにコードを修正します。
ax.set_xticks([0, 1, 2, 3]) で tick location を指定します。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
ax.plot(names, values, linewidth=2.5, marker='o')

print(ax.get_xticklabels())
ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(['りんご', 'オレンジ', 'レモン', 'ライム'])
print(ax.get_xticklabels())

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_c.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

ここで、日本語問題に出くわします。
missing from current font. という指摘がされ、出力されたグラフも文字が豆腐になっています。
折れ線グラフ

この問題を解決するために、fontproperties パラメータを使います。
ax.set_xticklabels() のときに fontproperties で日本語を持つフォントを指定します。
コード例では、MPLUSRounded1c-Black.ttf を指定しています。
文字は Googleフォント などからダウンロードしてください。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
ax.plot(names, values, linewidth=2.5, marker='o')

fp = FontProperties(fname='MPLUSRounded1c-Black.ttf')

ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(
    ['りんご', 'オレンジ', 'レモン', 'ライム'],
    fontproperties=fp,
    fontsize=8,
    )

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_d.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

このようなグラフが出力されます。
折れ線グラフ

ラベルを回転させる

メモリラベルを回転させるのは、rotation パラメータです。
ha パラメータは、horizontalalignment のことです。
matplotlib.axes.Axes.set_xticklabels のドキュメント
matplotlib.text.Text のドキュメント を見てください。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
ax.plot(names, values, linewidth=2.5, marker='o')

fp = FontProperties(fname='MPLUSRounded1c-Black.ttf')

ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(
    ['りんご', 'オレンジ', 'レモン', 'ライム'],
    fontproperties=fp,
    fontsize=8,
    rotation=45,
    ha="center",
    )

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_e.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

このようなグラフが出力され、下の方が切れています。
折れ線グラフ

グラフの周りの余白を調整するのは、subplots_adjust() です。
plt.subplots_adjust(bottom=0.2) でグラフの下に余白を入れます。
matplotlib.pyplot.subplots_adjust のドキュメント を見てください。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
plt.subplots_adjust(bottom=0.2)
ax.plot(names, values, linewidth=2.5, marker='o')

fp = FontProperties(fname='MPLUSRounded1c-Black.ttf')

ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(
    ['りんご', 'オレンジ', 'レモン', 'ライム'],
    fontproperties=fp,
    fontsize=8,
    rotation=45,
    ha="center",
    )

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_f.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

このようになります。
折れ線グラフ

X軸のタイトルを入れる

最後に、X軸のタイトルを付けます。
ax.set_xlabel()で付けることができます。
matplotlib.axes.Axes.set_xlabel のドキュメント を見てください。

Python


import os
from datetime import datetime
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

data = {'apple': 10, 'orange': 15, 'lemon': 5, 'lime': 20}
names = list(data.keys())
values = list(data.values())

fig, ax = plt.subplots(1, 1, figsize=(3.2, 2.4))
plt.subplots_adjust(bottom=0.3)
ax.plot(names, values, linewidth=2.5, marker='o')

fp = FontProperties(fname='MPLUSRounded1c-Black.ttf')

ax.set_xticks([0, 1, 2, 3])
ax.set_xticklabels(
    ['りんご', 'オレンジ', 'レモン', 'ライム'],
    fontproperties=fp,
    fontsize=8,
    rotation=45,
    ha="center",
    )
ax.set_xlabel('商品', fontproperties=fp)

filename = 'graph_plot_' + datetime.today().strftime('%Y%m%d') + '_g.png'
file_path = os.path.join(os.getcwd(), filename)
plt.savefig(file_path)

このようになりました。
折れ線グラフ