Tim*_* GO 11 python plot numpy matplotlib
是否有一种简单的方法可以将积极和消极趋于无穷大的函数绘制成单个图,而不将图形连接到正负两端?
例如,使用此代码绘制y = 1/x得出结果图:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
x=np.setdiff1d(np.linspace(-10,10,100),[0]) #to remove the zero
y=f(x)
plt.plot(x, y, label=fx_name)
plt.legend(loc='upper left')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但我想要这个输出,我通过绘制两个独立的域来实现:
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
xfn=np.setdiff1d(np.linspace(-10,0,100),[0])
xfp=np.setdiff1d(np.linspace(0,10,100),[0])
yfn=f(xfn)
yfp=f(xfp)
yf = plt.plot(xfn, yfn, label=fx_name)
plt.plot(xfp, yfp, color=yf[0].get_color())
plt.legend(loc='upper left')
plt.show()
Run Code Online (Sandbox Code Playgroud)
是否有捷径?非常感谢.
在域数组中包含零,并将除数除以零.这会强制返回的共域数组的一个元素为"inf",并且不会绘制"inf".
import numpy as np
import matplotlib.pyplot as plt
def f(x):
with np.errstate(divide='ignore', invalid='ignore'):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
x=np.linspace(-10,10,101)
y=f(x)
plt.plot(x, y, label=fx_name)
plt.legend(loc='upper left')
plt.show()
Run Code Online (Sandbox Code Playgroud)
我更喜欢这种方法,因为它避免了对数组的手动操作,并且可以很容易地重用于共享相同域的其他函数(例如,y = 1 /(x + 2)).谢谢大家的贡献.
实际上你想要包括x = 0因为这导致了y = nan,在情节中形成了一个空白.
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return 1/x
fx_name = r'$f(x)=\frac{1}{x}$'
# using 101 steps results in in array including the value 0
x=np.linspace(-10,10,101)
# f(0) = nan -> a nan value creates a gap
y=f(x)
plt.plot(x, y, label=fx_name)
plt.legend(loc='upper left')
plt.show()
Run Code Online (Sandbox Code Playgroud)
作为您的解决方法,没有必要更容易,但您可以在符号翻转的索引处插入"nan"元素,例如:
idx = np.argmax(np.diff(np.sign(y)))+1
x = np.insert(x, idx, np.nan)
y = np.insert(y, idx, np.nan)
Run Code Online (Sandbox Code Playgroud)
'nan'导致Matplotlib中断该行.