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