【Python入門】Matplotlibで複数のグラフを1つの図に組み合わせる方法(subplot・twinx活用)
はじめに
Matplotlibは、同じグラフ上に複数のプロットを重ねて描画できる強力なPythonの可視化ライブラリです。本チュートリアルでは、2つの異なるY軸を使いながら、1つの図の中に複数のデータを組み合わせて表示する方法を、実際に動くコード例とともにわかりやすく解説します。
事前準備:Matplotlibのインストール
まず、Pythonのコマンドプロンプト(ターミナル)を開き、以下のコマンドでmatplotlibをインストールしてください。
pip install matplotlib
手順1:表示するデータを準備する
ここでは、iPhone・Galaxy・Pixelの3機種について、2016年から2020年までの販売台数(単位:百万台)を例にします。※数値は説明用のダミーデータであり、実際の統計ではありません。
import matplotlib.pyplot as plt
# データの準備(統計値はダミーです)
mobile = ['Iphone','Galaxy','Pixel']
# 2016年〜2020年のモバイル販売台数(百万台)
units_sold = (('2016',12,8,6),
('2017',14,10,7),
('2018',16,12,8),
('2019',18,14,10),
('2020',20,16,5),)
手順2:データをメーカーごとの配列に分割する
zip(*units_sold) を使うと、タプルの集まりを「年」「iPhone販売数」「Galaxy販売数」「Pixel販売数」のそれぞれの配列に簡単に分解できます。あわせて、棒グラフの表示位置(Position)と棒の幅(Width)も設定しておきましょう。
# データの分割 Years, IPhone_Sales, Galaxy_Sales, Pixel_Sales = zip(*units_sold) # 表示位置の設定 Position = list(range(len(units_sold))) # 棒の幅の設定 Width = 0.2
手順3:最初のサブプロットを作成する
plt.subplot(2, 1, 1) により、「縦2行 × 横1列」のレイアウトにおける1番目(上段)の描画領域を作成します。
plt.subplot(2, 1, 1)

手順4:iPhone販売数の棒グラフを作成する
上段のサブプロットに、iPhoneの販売台数を緑色の棒グラフとして描画します。plt.xticks() でX軸の目盛りに年を表示させると、グラフが格段に読みやすくなります。
Iphone = plt.bar(Position, IPhone_Sales,color='green')
plt.ylabel('IPhone Sales')
plt.xticks(Position, Years)

手順5:Galaxy販売数用に第2のY軸を追加する
plt.twinx() を使うと、X軸を共有したまま右側に第2のY軸を追加できます。これにより、同じグラフ上にGalaxyの販売台数を青色の折れ線グラフ(マーカー付き)として重ねて表示することが可能になります。棒グラフと折れ線グラフの組み合わせは、異なる単位や規模のデータを比較したいときに非常に便利です。
plt.twinx()
Galaxy = plt.plot(Position, Galaxy_Sales, 'o-', color='blue')
plt.ylabel('Galaxy Sales')
plt.xticks(Position, Years)

手順6:Google Pixel販売数を下段にプロットする
続いて、plt.subplot(2, 1, 2) で2番目(下段)のサブプロットを作成し、Pixelの販売台数を黄色の折れ線グラフとして描画します。set_ylim(ymin=0) でY軸の最小値を0に固定しておくと、変化の傾向がより正確に伝わります。
plt.subplot(2, 1, 2) plt.plot(Position, Pixel_Sales, color='yellow') plt.gca().set_ylim(ymin=0) plt.xticks(Position, Years)

完成コード:全体をまとめて画像として保存する
最後に、ここまでの手順をすべてまとめた完全なコードを示します。plt.show() の代わりに plt.savefig() を使えば、作成したグラフをそのままPNG画像としてファイル保存できます(dpi引数で解像度を指定可能です)。
import matplotlib.pyplot as plt
# データの準備(統計値はダミーです)
mobile = ['Iphone','Galaxy','Pixel']
# 2016年〜2020年のモバイル販売台数(百万台)
units_sold = (('2016',12,8,6),
('2017',14,10,7),
('2018',16,12,8),
('2019',18,14,10),
('2020',20,16,5),)
# データの分割
Years, IPhone_Sales, Galaxy_Sales, Pixel_Sales = zip(*units_sold)
# 表示位置の設定
Position = list(range(len(units_sold)))
# 棒の幅の設定
Width = 0.2
plt.subplot(2, 1, 1)
Iphone = plt.bar(Position, IPhone_Sales,color='green')
plt.ylabel('IPhone Sales')
plt.xticks(Position, Years)
plt.twinx()
Galaxy = plt.plot(Position, Galaxy_Sales, 'o-', color='blue')
plt.ylabel('Galaxy Sales')
plt.xticks(Position, Years)
plt.subplot(2, 1, 2)
plt.plot(Position, Pixel_Sales, color='yellow')
plt.ylabel('Pixel Sales')
plt.gca().set_ylim(ymin=0)
plt.xticks(Position, Years)
# plt.show()
plt.savefig('CombiningGraphs.png', dpi=72)

まとめ
このように、Matplotlibの subplot() と twinx() を組み合わせることで、棒グラフと折れ線グラフなど異なる種類のグラフを柔軟に1つの図へ配置できます。複数の指標を並べて比較したいデータ分析やレポート作成の場面で、ぜひ活用してみてください。
-
Pythonで対数ヒストグラムを作成する方法【matplotlib活用】
Pythonのmatplotlibを使って対数(ログ)スケールのヒストグラムを作成するには、hist()メソッドの引数にlog=Trueを指定します。これにより、縦軸が対数スケールで表示され、値の範囲が大きく異なるデータも見やすく可視化できます。作成手順数値のリスト(配列)を用意します。density=Trueを指定して、正規化されたヒストグラムをプロットします。図を表示するには、show()メソッドを呼び出します。サンプルコードimport numpy as np import matplotlib.pyplot as plt plt.rcParams[figure.figsize] = [
-
Pythonで時系列データをプロットする方法をわかりやすく解説
Pythonのmatplotlibを使えば、時系列データ(日時を軸にしたデータ)を簡単にグラフ化できます。ここでは、datetimeオブジェクトを含むデータを折れ線グラフとして描画する基本的な手順を紹介します。 時系列プロットの基本手順 numpyを使用して、x軸(日時データ)とy軸(数値データ)を作成します。 plot()メソッドを使って、作成したx・yのデータをプロットします。 show()メソッドを実行して、図を画面に表示します。 コード例 以下のサンプルコードでは、2021年1月1日の0時から23時までの24個の日時データを生成し、それに対応するランダムな数値をy軸としてプロットし