【Matplotlib】グラフの中にグラフを作成 (Inset Plot in Matplotlib)
はじめに
今回は、グラフの中にもう一つグラフを描く方法に関しての記事です。 グラフを描写するmatplotlibの基礎ができている方は簡単に作成できます。 そうでない方は以下の記事を参考にしてください。
コード
モジュール
まずは必要なモジュールをインポートします。
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)
※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
※loc1とloc2はそれぞれ、グレーの線の位置を表しており、以下の図のようになっています。
参考文献
それでは🌏