基本事項
散布図
|
Matplotlib散布図 (scatter)Matplotlib のモジュール Pyplot を使い散布図の作成方法を示します. 目次基本事項概要散布図の例シンプル# -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt # ----- 条件設定 ----- N = 1000 # サンプル数 # ----- 散布図用のデータの作成 ----- x0 = np.random.normal(0, 1, N) y0 = np.random.normal(0, 1, N)-x0**2+7 x = x0*np.cos(np.pi/4) + y0*np.sin(np.pi/4) y = -x0*np.sin(np.pi/4) + y0*np.cos(np.pi/4) # ----- プロット(散布図)作成 ----- plt.rcParams["font.size"] = 18 fig = plt.figure() fig.subplots_adjust(bottom=0.12) ax = fig.add_subplot(1,1,1) ax.set_xlabel("$x$", fontsize=24, fontname='serif') ax.set_ylabel("$y$", fontsize=24, fontname='serif') ax.tick_params(axis='both', length=10, which='major') ax.tick_params(axis='both', length=5, which='minor') ax.set_xlim(-10, 10) ax.set_ylim(-10, 10) ax.minorticks_on() ax.scatter(x, y, s=10, marker='x', edgecolor="b") plt.show() fig.savefig('scatter.pdf', orientation='portrait', transparent=False, bbox_inches=None, frameon=None) fig.savefig('scatter.svg', orientation='portrait', transparent=False, bbox_inches=None, frameon=None) fig.clf() 色付きデータの数が多くなると,データ点が重なり,分布がわかりにくくなります.このような場合,データ点の密度に応じた色付きの散布図にすると,分布の様子が分かりやすくなります. # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt from scipy.stats import gaussian_kde # ----- 条件設定 ----- N = 10000 # サンプル数 # ----- 散布図用のデータの作成 ----- x0 = np.random.normal(0, 1, N) y0 = np.random.normal(0, 1, N)-x0**2+7 x = x0*np.cos(np.pi/4) + y0*np.sin(np.pi/4) y = -x0*np.sin(np.pi/4) + y0*np.cos(np.pi/4) # ----- データ点の密度の計算 ---- xy = np.vstack([x,y]) z = gaussian_kde(xy)(xy) # ----- 密度の高い点を最後にプロットするように密度でソート ---- idx = z.argsort() x, y, z = x[idx], y[idx], z[idx] # ----- プロット(散布図)作成 ----- plt.rcParams["font.size"] = 18 fig = plt.figure() fig.subplots_adjust(bottom=0.12) ax = fig.add_subplot(1,1,1) ax.set_xlabel("$x$", fontsize=24, fontname='serif') ax.set_ylabel("$y$", fontsize=24, fontname='serif') ax.tick_params(axis='both', length=10, which='major') ax.tick_params(axis='both', length=5, which='minor') ax.set_xlim(-10, 10) ax.set_ylim(-10, 10) ax.minorticks_on() ax.scatter(x, y, c=z, marker='o', s=10, edgecolor='') plt.show() fig.savefig('scatter.pdf', orientation='portrait', transparent=False, bbox_inches=None, frameon=None) fig.savefig('scatter.svg', orientation='portrait', transparent=False, bbox_inches=None, frameon=None) fig.clf() 正規分布と誤差楕円正規分布とそれの誤差楕円 # -*- coding:utf-8 -*- import numpy as np from numpy.random import multivariate_normal as normal import matplotlib.pyplot as plt from matplotlib.patches import Ellipse import matplotlib.transforms as transforms # ------------------------------------------------------------- # https://matplotlib.org/devdocs/gallery/statistics/ # confidence_ellipse.html # 入力引数 # x, y: 入力データ 配列, shape (n, ) # ax: matplotlib.axes.Axes # n_std: float 標準偏差の n_std 倍のプロットを作成 # **kwargs: `~matplotlib.patches.Ellipse` が引き継ぐ # 戻り値 # matplotlib.patches.Ellipse # ------------------------------------------------------------- def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs): ''' 分布の楕円を作成する. ''' if x.size != y.size: raise ValueError("x and y must be the same size") cov = np.cov(x, y) mean_x, mean_y = np.mean(x), np.mean(y) pearson = cov[0, 1]/np.sqrt(cov[0, 0] * cov[1, 1]) ell_radius_x = np.sqrt(1 + pearson) ell_radius_y = np.sqrt(1 - pearson) ellipse = Ellipse((0.0, 0.0), width=ell_radius_x*2, height=ell_radius_y*2, facecolor=facecolor, **kwargs) scale_x = np.sqrt(cov[0, 0]) * n_std scale_y = np.sqrt(cov[1, 1]) * n_std transf = transforms.Affine2D() \ .rotate_deg(45) \ .scale(scale_x, scale_y) \ .translate(mean_x, mean_y) ellipse.set_transform(transf + ax.transData) return ax.add_patch(ellipse) if __name__ == "__main__": # --- プロットデータの作成 --- xlim, ylim = [-10, 10], [-10, 10] mean = [-1, -2] cov = [[8, -3], [-3, 4]] x, y = normal(mean, cov, 1000).T # --- プロットの作成 OO-API --- fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.set_title("2D normal distribution", fontsize=20, fontname='serif') ax.set_xlabel("x data", fontsize=20, fontname='serif') ax.set_ylabel("y data", fontsize=20, fontname='serif') ax.tick_params(axis='both', length=10, which='major', labelsize=16) ax.tick_params(axis='both', length=5, which='minor') ax.set_xlim(xlim) ax.set_ylim(ylim) ax.minorticks_on() ax.grid(b=True, which='major', axis='both') ax.scatter(x, y, s=5, marker='o', edgecolor="b", label='scatter data') confidence_ellipse(x, y, ax, n_std=1, edgecolor='red', linewidth=2) confidence_ellipse(x, y, ax, n_std=2, edgecolor='green', linewidth=2) confidence_ellipse(x, y, ax, n_std=3, edgecolor='blue', linewidth=2) # ----- プロットの表示 ----- plt.show() # ----- プロットファイルの作成 ----- fig.savefig('normal_dist.pdf', orientation='portrait') fig.savefig('normal_dist.svg', orientation='portrait') fig.clf() matplotlib の scatter のより深い情報matplotlib.axes.Axes.scatter メソッドの引数は,以下のとおりです. Axes.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, **kwargs)
ページ作成情報参考資料
更新履歴
|