Python(Matplotlib)でグラフに凡例を追加する方法を徹底解説
はじめに
グラフの最大の目的は、データをわかりやすく伝えることです。「百聞は一見に如かず」という言葉のとおり、言葉では表現しにくい複雑な情報も、一枚の図やグラフがあれば直感的に伝えることができます。
しかし、多くの情報を含むグラフを描く場合は、どのデータがどの要素に対応しているのかを読み手が理解できるよう、凡例(legend)を添えると効果的です。
準備:matplotlibのインストールとデータ作成
matplotlibでは、凡例をさまざまな方法で表示できます。また、特定のポイントに注目させたい場合には注釈(annotation)も有効で、グラフ上の情報を読み手が理解する助けになります。
まず、Pythonのコマンドプロンプトを開き、次のコマンドでmatplotlibをインストールします。
pip install matplotlib
次に、表示するデータを準備します。
サンプルデータの作成
ここでは、3つのスマートフォンブランド(iPhone、Galaxy、Pixel)の年ごとの販売台数(単位:百万台)を想定したサンプルデータを作成します。
import matplotlib.pyplot as plt
# データ準備(※統計値は例示用のダミーデータです)
mobile = ['Iphone', 'Galaxy', 'Pixel']
# 年ごとのモバイル販売台数(単位:百万台)
units_sold = (('2016', 12, 8, 6),
('2017', 14, 10, 7),
('2018', 16, 12, 8),
('2019', 18, 14, 10),
('2020', 20, 16, 5),)データを各メーカーごとに分割する
準備したタプルを、メーカーごとの販売台数の配列に分割します。あわせてX軸のラベル(年)、棒の表示位置、棒の幅も定義しておきましょう。
# データ準備 - データの分割 IPhone_Sales = [Iphones for Year, Iphones, Galaxy, Pixel in units_sold] Galaxy_Sales = [Galaxy for Year, Iphones, Galaxy, Pixel in units_sold] Pixel_Sales = [Pixel for Year, Iphones, Galaxy, Pixel in units_sold] # データ準備 - ラベル Years = [Year for Year, Iphones, Galaxy, Pixel in units_sold] # 棒の表示位置 Position = list(range(len(units_sold))) # 棒の幅 Width = 0.2
棒グラフの作成と凡例・注釈の追加
準備したデータをもとに棒グラフを作成します。各製品の販売台数ごとに .bar() を呼び出し、表示位置と販売台数を指定します。
注釈は xy 属性と xytext 属性を使って追加します。データを見ると、Google Pixelの販売台数は2019年の1,000万台から2020年には500万台へと50%減少しています。そこで、最後のバーに対してテキストと矢印付きの注釈を設定してみましょう。
最後に legend パラメータを使って凡例を追加します。デフォルトでは、matplotlibはデータとの重なりが最も少ない領域に凡例を自動的に描画します。
plt.bar([p - Width for p in Position], IPhone_Sales, width=Width, color='green')
plt.bar([p for p in Position], Galaxy_Sales, width=Width, color='blue')
plt.bar([p + Width for p in Position], Pixel_Sales, width=Width, color='yellow')
# X軸を年に設定
plt.xticks(Position, Years)
# 軸ラベルを設定
plt.xlabel('Yearly Sales')
plt.ylabel('Unit Sales In Millions')
# 注釈を設定(xyとxytextで矢印の位置を調整)
plt.annotate('50% Drop in Sales', xy=(4.2, 5), xytext=(5.0, 12),
horizontalalignment='center',
arrowprops=dict(facecolor='red', shrink=0.05))
# 凡例を設定
plt.legend(mobile, title='Manufacturers')実行結果
<matplotlib.legend.Legend at 0x19826618400>

凡例をグラフの外側に表示する方法(bbox_to_anchor)
グラフの内側に凡例を追加すると煩雑に感じる場合は、bbox_to_anchor オプションを使って凡例をグラフの外側に配置できます。bbox_to_anchor は (X, Y) の座標を指定し、(0, 0) がグラフの左下、(1, 1) が右上に対応します。
注意: 凡例の位置を調整する際は、.subplots_adjust を使ってグラフの開始位置と終了位置を調整します。
たとえば right=0.5 と指定すると、プロットの右側に画面の50%の余白が残ります。left のデフォルト値は 0.125 で、左側に12.5%の余白が残る設定になっています。
plt.legend(mobile, title='Manufacturers', bbox_to_anchor=(1, 0.8)) plt.subplots_adjust(right=1.2)

完成版コード:グラフをファイルに保存する
最後に、作成したグラフを画像ファイルとして保存する方法を紹介します。plt.show() の代わりに plt.savefig() を使えば、作成したグラフをPNG形式で出力できます。
import matplotlib.pyplot as plt
# データ準備(※統計値は例示用のダミーデータです)
mobile = ['Iphone', 'Galaxy', 'Pixel']
# 年ごとのモバイル販売台数(単位:百万台)
units_sold = (('2016', 12, 8, 6),
('2017', 14, 10, 7),
('2018', 16, 12, 8),
('2019', 18, 14, 10),
('2020', 20, 16, 5),)
# データ準備 - データの分割
IPhone_Sales = [Iphones for Year, Iphones, Galaxy, Pixel in units_sold]
Galaxy_Sales = [Galaxy for Year, Iphones, Galaxy, Pixel in units_sold]
Pixel_Sales = [Pixel for Year, Iphones, Galaxy, Pixel in units_sold]
# データ準備 - ラベル
Years = [Year for Year, Iphones, Galaxy, Pixel in units_sold]
# 棒の表示位置
Position = list(range(len(units_sold)))
# 棒の幅
Width = 0.2
plt.bar([p - Width for p in Position], IPhone_Sales, width=Width, color='green')
plt.bar([p for p in Position], Galaxy_Sales, width=Width, color='blue')
plt.bar([p + Width for p in Position], Pixel_Sales, width=Width, color='yellow')
# X軸を年に設定
plt.xticks(Position, Years)
# 軸ラベルを設定
plt.xlabel('Yearly Sales')
plt.ylabel('Unit Sales In Millions')
# 注釈を設定(xyとxytextで矢印の位置を調整)
plt.annotate('50% Drop in Sales', xy=(4.2, 5), xytext=(5.0, 12),
horizontalalignment='center',
arrowprops=dict(facecolor='red', shrink=0.05))
# 凡例を設定
plt.legend(mobile, title='Manufacturers')
plt.subplots_adjust(right=1.2)
# plt.show()
plt.savefig('MobileSales.png')
-
Pythonにパスを追加する方法|Windowsの環境変数設定でエラーを解消する手順
Pythonとは? Pythonは1991年に初めてリリースされたプログラミング言語です。WindowsやmacOS、Linuxなど複数のOSで動作し、開発者はさまざまな用途のコードを記述・開発できます。Web開発、データ分析、AI・機械学習など幅広い分野で活用されており、その柔軟性と充実したサポート体制から、世界で最も広く使われているプログラミング言語のひとつとなっています。 コマンドプロンプトでpythonが認識されない原因 コマンドプロンプトで「python」と入力してもエラーが返され、正しく動作させるには毎回フルパスを指定しなければならないことがあります。これは、コマンドプロンプトが
-
Rubyで例外にコンテキストデータを追加する3つの方法
標準のバックトレースやエラーメッセージだけでは、エラーの原因を特定するのに十分な情報が得られないことがあります。そんなときに役立つのが、例外への追加データの付与です。幸い、Rubyではこれをとても簡単に実現できます。 エラーメッセージをカスタマイズする 例外にコンテキスト情報を加える最もシンプルな方法は、メッセージそのものに情報を組み込んでしまうことです。次の例では、発生した例外を捕捉し、新しいメッセージを付けて再送出しています。 begin raise foo rescue => e raise e.class, bar end # RuntimeError: bar