如何将y=1/x绘制为单个图形

2024-05-21 08:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种简单的方法来绘制一个函数,这个函数在正反两个方向上趋于无穷大,而没有正反两端的连接?

例如,使用此代码绘制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()

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}$'

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()

y=1/x

有捷径吗? 非常感谢。

解决方案

在域数组中包含零,并抑制除以零。这将强制返回的同域数组中的一个元素作为“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()

y=1/x

我更喜欢这种方法,因为它避免了对数组的手动操作,并且可以很容易地重用到共享同一域的其他函数(例如y=1/(x+2))。谢谢大家的贡献。


Tags: 函数nameimportnumpyreturnplotmatplotlibdef
3条回答

实际上你想要包含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()

基于Rutger Kassiesides:

n_points = 100
x=np.setdiff1d(np.linspace(-10,10,n_points),[0]) #to remove the zero

y=f(x)
y[n_points//2-1:n_points//2+1] = np.nan

使用原始绘图,将点设置在0到np.nan之间。这样,太多的点被设置为None,但它是对称的。

您还可以设置linspace来包含0,以便f(x) = np.nann_points = 101。(this answer和2条评论指出,就在我之前。。。请记在这里)。

作为解决方法,不必这么简单,但可以在符号翻转的索引处插入“nan”元素,例如:

idx = np.argmax(np.diff(np.sign(y)))+1

x = np.insert(x, idx, np.nan)
y = np.insert(y, idx, np.nan)

“nan”使Matplotlib中断该行。

相关问题 更多 >