Как построить график y = 1/x как один граф

Есть ли простой способ построить функцию, которая стремится к бесконечности в положительном и отрицательном как один график, без графика, соединяющего оба конца положительного и отрицательного?

Например, построение 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)). Спасибо всем за вклад.

Ответ 1

На самом деле вы хотите включить 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()

Ответ 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)

"Нан" заставляет Matplotlib прерывать линию.

Ответ 3

на основе Rutger Kassies:

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.nan: n_points = 101. (этот ответ и 2 комментария заявили, что прямо перед тем, как я сделал... пожалуйста, кредитуйте там).