如何用Matplotlib处理渐近线/不连续点?
当我们在画图时,常常会遇到一些渐近线或者不连续点需要处理。这时候我们可以借助Matplotlib库来实现这一目的。
处理渐近线
Matplotlib提供了一个非常方便的函数axvline
和axhline
,可以用来画竖线和横线,在处理渐近线时非常有用。
垂直渐近线
考虑一个例子,我们需要在函数图像上画出x=2这条垂直渐近线。这时我们可以使用axvline
函数:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 100)
y = 1/x
plt.plot(x, y)
plt.axvline(x=2, color='r')
plt.show()
可以看到,红色的垂直线就是我们所画的渐近线。
水平渐近线
同理,如果我们需要画y=1这条水平渐近线,只需要使用axhline
函数即可:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 100)
y = 1/x
plt.plot(x, y)
plt.axhline(y=1, color='r')
plt.show()
同样的,红色的水平线就是我们所画的渐近线。
处理不连续点
当我们需要在图像上标出某个点时,如果该点是不连续的,我们需要处理一下。
简单分段函数
考虑一个简单的分段函数:
f(x)=\begin{cases}-x+2, 0\leq x \leq1,\x-2, 1< x\leq2.\end{cases}
我们要在图像中标出点(1, 1)。如果直接使用plot
函数,画出的图像如下:
import matplotlib.pyplot as plt
x = [0, 1, 2]
y = [2, 1, -2]
plt.plot(x, y)
plt.plot([1], [1], marker='o', markersize=10)
plt.show()
可以看到,标记点并不在函数图像上,这时我们需要使用plot
函数的标记选项markevery
来选择标记点的位置。通过设置markevery=[1]
,我们可以将标记放在第一个点上:
import matplotlib.pyplot as plt
x = [0, 1, 2]
y = [2, 1, -2]
plt.plot(x, y)
plt.plot([1], [1], marker='o', markersize=10, markevery=[1])
plt.show()
可以看到,标记点现在正确地出现在了函数图像上。
复杂分段函数
当函数比较复杂时,我们需要手动计算出标记点所在的线段的起点和终点,并用plot
函数将这个线段画出来。例如,我们要在以下复杂分段函数的图像上标记点(-1, 0.5):
f(x)=\begin{cases}\sin^2(x),x\leq0,\x^2,x>0,\1/3,x=0.\end{cases}
我们先绘制整个函数的图像:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 10, 1000)
y = np.zeros_like(x)
y[x<=0] = np.sin(x[x<=0])**2
y[x>0] = x[x>0]**2
y[x==0] = 1/3
plt.plot(x, y)
plt.plot([-1, 0, 0, -1], [0.5, 0.5, 1/3, 1/3], color='r')
plt.plot([-1], [0.5], marker='o', markersize=10, color='r', label='(-1,0.5)')
plt.legend()
plt.show()
可以看到,我们通过手动计算找出了标记点所在的线段起点和终点,将其用红色的线画出来,并将标记点放在了(-1, 0.5)处。
通过以上方法,我们可以处理所有渐近线和不连续点的问题,并且可以较好地控制它们的位置。