こんにちは。TATです。
今日のテーマは「matplotlibでグラフ目盛りの表示を変更する方法」です。
matplotlibで表示したグラフの目盛りを変更する方法についてご紹介します。
数値をカンマ区切りで表示したり、別名をつけて表示させたり、いろいろとカスタマイズしていきます。
不要な目盛りを消したり、強調したい目盛りの表記を変えたり、使いこなせるといろいろと便利です。
僕の備忘録のためにも、情報をまとめて記事として残しておこうと思います。
目次
xticks, yticksで目盛りを設定できる
目盛りを設定するには、xticksとyticksを使います。
適当なグラフを用意する
例として適当なグラフを用意します。
import random x = [i for i in range(10)] y = [random.randint(a=0,b=10) for i in range(10)]
これを折れ線グラフにするとこんな感じになります。
import matplotlib.pyplot as plt %matplotlib inline plt.plot(x, y)
特に指定しないと、目盛りは自動調整されます。
ここでは0, 2, 4, 6・・・となっていますね。
xticksやyticksを使えば、この表示設定をいじくることができます。
全ての目盛りを表示する
まずは全ての目盛りを表示させてみます。
先ほどは0, 2, 4, 6・・・となっており、1とか3は表示されていませんでしたが、xticksを使って無理やり表示させてみます。
plt.plot(x, y) plt.xticks(x)
x軸の目盛りの表記が変わり、全て表示されるようになりました。
xticksあるいはyticksにリスト形式の数値を引き渡してあげると、ここで指定された数値が表示されるようになります。
ポイント
- xticks, yticksにリスト形式で表示するデータを指定することができる
目盛りを非表示にする
次に目盛りを非表示にしてみます。
これは引き渡すリストを空にすればOKです。
plt.plot(x, y) plt.xticks([])
x軸の目盛りが非表示になりました。
目盛りを隠してグラフを見せたいときはこれが便利ですね。
ポイント
- xticks, yticksに空のリスト形式を指定すれば、目盛りを非表示にできる
特定の目盛りだけを表示させる
次に特定の目盛りだけを表示させてみます。
強調したい値があるときなんかには便利です。
特定の目盛りだけを表示する際には、xticksやyticksに表示させたい数値データのみをリスト形式に指定すればOKです。
例としてy軸に3と7だけを表示させてみます。
plt.plot(x, y) plt.yticks([3, 7])
yticksに[3, 7]を指定することで、y軸の目盛りには3と7しか表示されなくなりました。
ポイント
- xticks, yticksに任意の数値をリスト形式を指定すれば、その数値のみが表示される
xticks, yticksで目盛りの表示名を変更できる
次に目盛りの表示名を変更する方法について解説します。
先ほどは表示する目盛りの指定のみでしたが、次は表示名も変更します。
目盛りの表示名の変更についても、xticksとyticksで対応することができます。
この際、リストを2つ引き渡します。
1つ目のリストは表示したい目盛り(これまでの使い方と同じです)、2つ目のリストには表示名を指定することができます。
2つのリストの要素を紐づけて目盛り名を指定することができます。
例として、先ほどのグラフで目盛りの表示を変更してみます。
x軸の3をa、5をb、7をcとして表示してみます。
plt.plot(x, y) plt.xticks([3, 5, 7], ["a", "b", "c"])
各リストの中身が対応していることが確認できます。
最初の3はaに、5はbに、7はcに変更されました。
このように、xticks、yticksを使うと目盛りの表示名を変更することができます。
ポイント
- xticks, yticksに2つのリストを指定し、1つ目のリストで目盛りの値、2つ目のリストで表示名を指定することができる
Axesの場合はset_xticks, set_xticklabelsを使う
ここまではpyplotの例をご紹介してきました。
この場合はxticksやyticksを使えばOKです。
一方で、Axesを使う場合は少し方法が異なります。
結論、set_xticksやset_xtickslabelsを使います。
基本的な使い方はxticksと同じですが、表示名を変更する際には少しだけ書き方が異なります。
目盛りの設定はset_xticksで
目盛りの表示を変更したり非表示にしたりするにはset_xticksやset_yticksを使えばOKです。
先ほどのチャートをAxesを使って表示してみます。
fig, ax = plt.subplots() ax.plot(x, y)
全ての目盛りの表示
全ての目盛りを表示するにはset_xticks, set_yticksを使います。
fig, ax = plt.subplots() ax.plot(x, y) ax.set_xticks(x)
目盛りを非表示
目盛りを非表示にするにはset_xticksに空のリストを指定すればOKです。
xticksの使い方と全く同じです。
fig, ax = plt.subplots() ax.plot(x, y) ax.set_xticks([])
特定の目盛りのみを表示
特定の目盛りを表示するのも同様です。
リスト形式で任意の数値を指定すればOKです。
fig, ax = plt.subplots() ax.plot(x, y) ax.set_xticks([1, 3, 5, 7, 9]) ax.set_yticks([2, 5, 7, 10])
目盛りの表示名を変更するにはset_xticklabelsを使う
目盛りの表示名を変更するときだけ少しこれまでとはやり方が変わってきます。
xticksでは2つのリストを指定して設定することができましたが、set_xticksではこれはできません。
そのかわりに、set_xticklabelsを使う必要があります、
set_xticksで目盛りを指定して、set_xticklabelsで表示名を指定します。
例としてy軸の3をa、5をb、7をcとして表示してみます。
fig, ax = plt.subplots() ax.plot(x, y) ax.set_yticks([3, 5, 7]) ax.set_yticklabels(["a", "b", "c"])
きちんと対応できていることが確認できました。
目盛りの数値をカンマ区切りで表示する
最後に、目盛りの数値データをカンマ区切りで表示する方法について解説します。
これが地味に必要となってくる場面が多い気がします。
また適当なグラフを用意しました。
import random x = [i for i in range(30)] y = [random.randint(a=1000,b=100000) for i in range(30)] plt.plot(x, y)
これのy軸の目盛りをカンマ区切りにしてみます。
ここでは2つの方法を紹介します。
方法1: xticksやset_xticklabelsを活用する
まずはこれまでの流れと同様に、xticksやset_xticklabelsを使った方法をご紹介します。
y軸ならyticksやset_yticklabelsを利用します。
表示名を設定することができるので、ここでカンマ区切りになった値を指定すればOKです。
pyplotの場合はyticks()[0]、Axesの場合はget_yticks()でグラフの目盛り情報を取得できます。
これをカンマ区切りに変換して設定すればOKです。
xticks, yticks
まずはxticks, yticksの場合です。
ここではy軸の表示をカンマ区切りにするため、yticksを使います。
plt.plot(x, y) plt.yticks(plt.yticks()[0], ["{:,}".format(int(i)) for i in plt.yticks()[0]])
カンマ区切りになりました。
リスト内表記を使って一行でまとめました。
plt.yticksで目盛りの値を取得して、リスト内表記でそれぞれカンマ区切りに変換しています。
set_xticklabels,set_yticklabelsの場合
次にset_xticklabels, set_yticklabelsの場合も見てみます。
先ほど同様、y軸の表示を変更するため、set_yticklabelsを使います。
fig, ax = plt.subplots() ax.plot(x, y) ax.set_yticks(ax.get_yticks()) ax.set_yticklabels(["{:,}".format(int(i)) for i in ax.get_yticks()])
カンマ区切りで表示されました。
方法2: set_major_formatterを使う
次に別の方法としてset_major_formatterを使う方法についてご紹介します。
set_major_formatterで目盛りのフォーマットを指定することができます。
pyplotの場合
まずはpyplotの場合を見てみます。
plt.plot(x, y) plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
pyplotの場合、gca(). yaxis.set_major_formatterで目盛りのフォーマットを指定することができます。
gcaはget current axisの略みたいです。
フォーマットはplt.FuncFormatterを使ってコードのように指定すればOKです。
これでカンマ区切りになります。
またmatplotlib.ticker.FuncFormatterを使う方法もあります。
どちらでも結果は同じです。
plt.plot(x, y) plt.gca().get_yaxis().set_major_formatter(matplotlib.ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
これでもカンマ区切りで表示することができました。
Axesの場合
次にAxesの場合を見てみます。
これもほぼやり方は同じで、gcaは不要になります。
import matplotlib fig, ax = plt.subplots() ax.plot(x, y) ax.yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
これで数値をカンマ区切りで表示することができました。
matplotlibでグラフを描く際には、カンマ区切りにはデフォルトではならないので、結構役に立つ場面が出てくると思います。
matplotlibをベースに作られているseabornやmplfinanceでも有効
ここで紹介した方法については、matplotlibをベースにして作られているseabornやmplfinanceでも有効です。
Seaborn
Seabronでチャートを描く際にも、これまでと同じ方法がそのまま使えます。
import seaborn as sns fig = plt.figure(figsize=(12, 5)) sns.barplot(x, y) plt.gca().yaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
mplfinance
mplfinanceでも同様です。
mplfinanceはファイナンス系のチャートを簡単に描けるライブラリーで、ローソク足チャートなどのチャートを簡単に描くことができます。
詳細はこちらの記事でも解説しています。
ここでも先ほどと同様の方法で、数値をカンマ区切りにすることができます。
from pandas_datareader import data import mplfinance as mpf # 株価データを取得 df = data.DataReader("7203.T", "yahoo", start="2021-01-01", end="2021-12-31") # ローソク足チャート fig, ax = mpf.plot(df, type="candle", style="binance", returnfig=True,
datetime_format="%Y/%m/%d")
) ax[0].get_yaxis().set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
こちらもきちんと数値がカンマ区切りになりました。
一行追加するだけでカンマ区切りに変更できるので、matplotlibでグラフを描くたびに、この一行をコピペして使い回すと便利と思います。
Pythonのmplfinanceで株価のローソク足チャートを描く方法【コード解説】
続きを見る
まとめ
本記事では、「matplotlibでグラフの目盛り表示を変更する方法」について解説しました。
デフォルトでは、matplotlibで表示したグラフでは目盛りの数値データはカンマ区切りにはなりません。
そして表示する目盛りも自動調整されて表示されます。
xticksやset_xticklabelsを使えば、特定の数値のみを表示する、別名で表示する、目盛りを隠す、数値をカンマ区切りで表示するなど、いろいろとカスタマイズすることができます。
カンマ区切りの表記はset_major_formatterを使っても対応できます。
また、seabornやmplfinanceなどのように、mplfinanceをベースに作られているライブラリは多いので、本記事で紹介した内容を知っておくと結構活用できる場面が出てきます。
是非ともご活用ください!
ここまで読んでくださり、ありがとうございました。