RuntaScience diary

気象系データを扱う学生 旅が好きです

【Matplotlib】グラフの中にグラフを作成 (Inset Plot in Matplotlib)

この記事をシェアする

f:id:RuntaScience:20210507074110p:plain

はじめに

今回は、グラフの中にもう一つグラフを描く方法に関しての記事です。 グラフを描写するmatplotlibの基礎ができている方は簡単に作成できます。 そうでない方は以下の記事を参考にしてください。

runtascience.hatenablog.com

コード

モジュール

まずは必要なモジュールをインポートします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde #密度プロットに使用
#Inset plot in matplotlibに使用
from mpl_toolkits.axes_grid.inset_locator import (inset_axes, InsetPosition, mark_inset)

データ

データは相関プロットを想定し、以下の図のようなデータを用意しました。

#データ===================
#乱数の固定
np.random.seed(1)
#x, y のデータ用意
mu, sigma = 0, 0.01
x = 10 * np.random.normal(mu, sigma, size=5000) + 0.4
y = 1.2 * x + 2 * np.random.normal(mu, sigma, size=5000)

#回帰直線
p = np.polyfit(x, y, 1)
y_reg = p[0]*x + p[1]

#描写===================
fig = plt.figure(figsize=(8,6))
plt.rcParams["font.size"] = 18

ax=fig.add_subplot(111)
ax.plot(x, y_reg, color="r")

# KDE probability
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy)
# zの値で並び替え→x,yも並び替える
idx = z.argsort() 
x2, y2, z2 = x[idx], y[idx], z[idx]
ax.scatter(x2, y2, c=z2, s=50, cmap="jet")

#軸設定
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_ylim(0, 1)
ax.set_xlim(0, 1)

f:id:RuntaScience:20210506065748p:plain

※KDEプロットに関しては以下の記事をご覧ください。 runtascience.hatenablog.com

描写

それでは本記事が目的とするグラフを作成してみます。

fig = plt.figure(figsize=(6, 6))
plt.rcParams["font.size"] = 18
ax=fig.add_subplot(111)

#1:1のライン
x_1=[0,100]
y_1=[0,100]
ax.plot(x_1,y_1,"--", color="k")

#linear regression
p = np.polyfit(x, y, 1)
y_reg = x*p[0]+p[1]
#correlation
correlation = np.corrcoef(x,y)
#dataCounts
dn=len(x)
print("Slope",p[0],"R", correlation[0,1], "N:", dn)

# KDE probabilityプロット
xy = np.vstack([x,y]) 
z = gaussian_kde(xy)(xy)
# zの値で並び替え→x,yも並び替える
idx = z.argsort() 
x2, y2, z2 = x[idx], y[idx], z[idx]
ax.scatter(x2, y2, c=z2, s=50, cmap="jet")
ax.plot(x,y_reg,"-", color="r")

#範囲設定
ax.set_xlim(0,1)
ax.set_ylim(0,1)

#Inset Plot in Matplotlib
#ax2をaxes内に用意する
ax2 = plt.axes([0, 0, 1, 1]) #axes([左, 下, 幅, 高さ])
#位置の設定(外枠のaxを基準とする)
position = InsetPosition(ax, [0.6, 0.1, 0.3, 0.3]) #[左, 下, 幅, 高さ]
ax2.set_axes_locator(position)
# axの該当範囲に枠を入れる
mark_inset(ax, ax2, loc1=2, loc2=4, edgecolor="gray") #※

ax2.scatter(x2, y2, c=z2, s=50, cmap="jet")
ax2.plot(x,y_reg,"-", color="r")
ax2.plot(x_1,y_1,"--", color="k")

# 表示範囲
ax2.set_ylim(0.08, 0.3)
ax2.set_xlim(0.08, 0.3)

plt.show()
Slope 1.201448761013043 R 0.9866316441109919 N: 5000

f:id:RuntaScience:20210506065803p:plain

※loc1とloc2はそれぞれ、グレーの線の位置を表しており、以下の図のようになっています。

f:id:RuntaScience:20210507073526p:plain

参考文献

matplotlib.org

scipython.com

それでは🌏

プライバシーポリシー
お問い合わせ