Python, matplotlibでy = sinθなどのグリッド表示をしてみたい

グリッド表示


y = sinxなどの関数はxの増加量に対するyの増加量がいつも一定ではない.(傾きが一定じゃない関数だったら当たり前のこと)
これをPythonのmatplotlibをつかって示したい.そのためにグリッドを使う.
x軸y軸それぞれ等間隔にグリッドをつくるのではなく,x軸は一定間隔に保って,(あるy = sinxなどの関数で)y軸をxに対応する等間隔ではないグリッドとして表示させたいって話.

コード:


import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)

plt.figure(figsize = (10, 6))
plt.plot(x, y)
plt.grid()
plt.xticks(np.arange(0, 2 * np.pi, np.pi / 8))
y_range = []
for i in np.arange(0, 2 * np.pi, np.pi / 8):
    y_range.append(np.sin(i))
plt.yticks(y_range)

plt.title("y = sinx", fontsize = 16)
plt.xlabel("x")
plt.ylabel("y")
#plt.show()
plt.savefig("sin_y_theta.png")


グラフ

言いたいのはここ

plt.grid()
plt.xticks(np.arange(0, 2 * np.pi, np.pi / 8))
y_range = []
for i in np.arange(0, 2 * np.pi, np.pi / 8):
    y_range.append(np.sin(i))
plt.yticks(y_range)

plt.xticks() を使えば,x軸のグリッド間隔を決められるが,この関数の引数は配列で渡せる.

xticks(一定間隔の配列(ここではπ/8間隔))
にして関数にその配列を代入させればいい

y_rangeにy = sin(一定間隔の配列(ここではπ/8間隔)を1つずつ)
の値を追加していったら

yticks(y_range)でy軸をxに対応する等間隔ではないグリッドとして表示させることができる.

あとはこの

一定間隔の配列(ここではπ/8間隔)

y_range       (=y = sin(一定間隔の配列(ここではπ/8間隔)を1つずつ))

を見やすく比較すればいい

data = np.vstack([np.arange(0, 2 * np.pi, np.pi / 8), y_range])

これで2行の配列ができた.
np.concatenateを使うと思っていたが,1次元配列どうしではできないみたい.
あとy_rangeとnp.arangeでは型が違うが,np.array(y_range)にしなくともできるみたい.

あとはこれをnp.tableをつかってまとめる


import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2 * np.pi, 0.1)
y = np.sin(x)

# グラフ
plt.figure(figsize = (10, 6))
plt.plot(x, y)
plt.grid()
plt.xticks(np.arange(0, 2 * np.pi, np.pi / 8))
y_range = []
for i in np.arange(0, 2 * np.pi, np.pi / 8):
    y_range.append(np.sin(i))
plt.yticks(y_range)

plt.title("y = sinx", fontsize = 16)
plt.xlabel("x")
plt.ylabel("y")
plt.savefig("sin_y_theta.png")

# 表
plt.figure(figsize = (10, 6))
plt.rcParams['font.family'] = 'Times New Roman'
data = np.vstack([np.arange(0, 2 * np.pi, np.pi / 8), y_range])
distace_data = np.zeros((2, 10))
for i in range(10):
    distace_data[0][i] = data[0][i + 1] - data[0][i]
    distace_data[1][i] = data[1][i + 1] - data[1][i]
plt.table(cellText = np.round(distace_data, 2), rowLabels = ["X[i] to X[i+1]", "Y[i] to Y[i+1]"], loc = "center")
plt.axis("off")
#plt.subplots_adjust()
plt.savefig("sin_y_theta_table.png")


参考:

結果できたものがこれ

増加量の表

xの増加量は一定で
yが変化するってことがいいたかっただけ
subplotをつかったら見づらくなったのでやめた

この記事が気に入ったらサポートをしてみませんか?