グラフを作成するとき、とある関数のとある値までで描画を打ち切りたいことがあり、ちょっと考え込んでしまったのでメモを残します。
まず、とある指数関数のグラフを描いてみます。
import numpy as np
import matplotlib.pyplot as plt
def curve(x):
return np.exp(0.1*x)
x = np.linspace(0, 60)
y = curve(x)
fig, ax = plt.subplots()
ax.plot(x, y, 'k')
plt.show()
途中から立ち上がりが鋭くなり、横軸xが60で縦軸yが400ちょっとまであります。これを、縦軸が200を超えたところで打ち切りたいとします。いろいろな方法がありそうですが、np.whereでyの中身を判定して、その判定結果(TrueかFalseの配列)を変数に保存し、グラフ描画のときのxとyに[]を付けて判定結果でフィルタしてやれば実現できました。
すなわち、
th = np.where(y<200) # yが200以下の場所
ax.plot(x[th], y[th], '-r')
という処理をした上でグラフ描画します。
全体のコードは以下のようになります(比較しやすくするため、打ち切らない値も併せて描画させています)。今回の処理では、ぴったり200の所で描画しなくなるのではなく、200を下回る最大の値の所で打ち切っています。そのため、場合によっては200の随分手前で描画が打ち切られることもありますので、そのような場合は、xの配列をnp.linspaceで作成するときに間隔を細かくすれば、ある程度対応可能です。
import numpy as np
import matplotlib.pyplot as plt
def curve(x):
return np.exp(0.1*x)
x = np.linspace(0, 60)
y = curve(x)
fig, ax = plt.subplots()
th = np.where(y<200) # yが200以下の場所
ax.plot(x, y, '--k', alpha=0.3)
ax.plot(x[th], y[th], '-k')
plt.show()
もっといい方法がある気がするのですが、当面はこれでしのげています。