logo

Python matplotlibで複雑なレイアウトのサブプロットを描く方法 📂プログラミング

Python matplotlibで複雑なレイアウトのサブプロットを描く方法

概要

基本的にplt.subplot(nrows, ncols, index)plt.subplots(nrows, ncols)グリッド形式のサブプロットを描画できる。この記事ではもっと複雑なサブプロットの描画方法を紹介する。グリッドに依存せずに重ねて描く方法や、本当に自分の好きなように描画する方法はこちらを参照してください。

コード

plt.subplot(nrows, ncols, index)

plt.subplotを使う時、indexの位置に整数ではなくタプルを入れると、複数のグリッドにまたがって図を描ける。イラっとくる点はここでのindexがインデクシングでもスライシングでもないということだ。したがって、インデックスは$0$ではなく$1$から始まる(Pythonのインデクシングではないため)。また、スライシングではなくタプルなので、(3,4)は正直に第三から第四のサブプロットを意味する。例として上の行に2枚、下の行に1枚の図を配置するコードは下記の通りだ。

import matplotlib.pyplot as plt
import numpy as np

plt.subplot(2, 2, 1)                                     # 좌상단에 막대그래프 그리기
plt.bar(np.arange(10), np.random.randn(10))

plt.subplot(2, 2, 2)                                     # 우상단에 산점도 그리기
plt.scatter(np.random.randn(10), np.random.randn(10))

plt.subplot(2, 2, (3,4))                                 # 하단에 선그래프 그리기
plt.plot(np.random.randn(10))                           

plt.show()

gridspec

gridspecを使うと、上記とは異なり実際にインデクシングとスライシングが可能になり、もっと便利で他のコードとも直感的にうまく組み合わせることができる。上と全く同じ図を描くコードは、

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np

gs = gridspec.GridSpec(2, 2)                             # 그리드스펙 생성

plt.subplot(gs[0])                                       # 좌상단에 막대그래프 그리기
plt.bar(np.arange(10), np.random.randn(10))

plt.subplot(gs[1])                                       # 우상단에 산점도 그리기
plt.scatter(np.random.randn(10), np.random.randn(10))    

plt.subplot(gs[2:])                                      # 하단에 선그래프 그리기
plt.plot(np.random.randn(10))

plt.show()

レシピ

横比率調整

gs = gridspec.GridSpec(2, 2, width_ratios=[1,3])         # 그리드스펙 생성, 가로 비율 1:3

plt.subplot(gs[0])                                       # 좌상단에 막대그래프 그리기
plt.bar(np.arange(10), np.random.randn(10))

plt.subplot(gs[1])                                       # 우상단에 산점도 그리기
plt.scatter(np.random.randn(10), np.random.randn(10))    

plt.subplot(gs[2:])                                      # 하단에 선그래프 그리기
plt.plot(np.random.randn(10))


縦比率調整

gs = gridspec.GridSpec(2, 2, height_ratios=[1,2])        # 그리드스펙 생성, 세로 비율 1:2

plt.subplot(gs[0])                                       # 좌상단에 막대그래프 그리기
plt.bar(np.arange(10), np.random.randn(10))

plt.subplot(gs[1])                                       # 우상단에 산점도 그리기
plt.scatter(np.random.randn(10), np.random.randn(10))    

plt.subplot(gs[2:])                                      # 하단에 선그래프 그리기
plt.plot(np.random.randn(10))


$_{\thinspace \thinspace \square}^{\square \square}$の形態のレイアウト

gs = gridspec.GridSpec(2, 4)                             # 그리드스펙 생성

plt.subplot(gs[0:2])                                     # 좌상단에 막대그래프 그리기
plt.bar(np.arange(10), np.random.randn(10))

plt.subplot(gs[2:4])                                     # 우상단에 산점도 그리기
plt.scatter(np.random.randn(10), np.random.randn(10))        

plt.subplot(gs[5:7])                                     # 하단에 선그래프 그리기
plt.plot(np.random.randn(10))

plt.subplots_adjust(wspace=1)


環境

  • OS: Windows11
  • バージョン: Python 3.9.13, matplotlib==3.6.2, numpy==1.23.5