Как избежать построения линий через разрывы (вертикальные асимптоты)? - PullRequest
0 голосов
/ 23 октября 2019

У меня есть код для ctg(x), но я не хочу асимптот или хочу, чтобы они имели другой цвет. Я новичок, и я не знаю, что я могу изменить в этом коде:

import matplotlib.ticker as tck
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(8,5))
x=np.linspace(-np.pi, np.pi,100)
y=np.cos(x)/np.sin(x)
plt.ylim([-4, 4])
ax.plot(x/np.pi,y)
plt.title("f(x) = ctg(x)")
plt.xlabel("x")
plt.ylabel("y")
ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
plt.savefig('ctg')
plt.show()

enter image description here

1 Ответ

0 голосов
/ 23 октября 2019

Рисуется не асимптот, а линия для точек вокруг нуля. Чтобы преодолеть это, вы должны создать два графика для положительной и отрицательной частей по отдельности, убедившись, что цвет (стиль?) Для двух графиков одинаков (и при желании получить первый цвет по умолчанию для matplotlib). Поскольку np.linspace() включает в себя экстремумы, они могут случайно создать один и тот же артефакт. Чтобы преодолеть это, достаточно добавить / вычесть небольшое число (epsilon) к экстремумам.

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(8,5))

# get first default color
color = plt.rcParams['axes.prop_cycle'].by_key()['color'][0]

epsilon = 1e-7
intervals = (
    (-np.pi, 0),
    (0, np.pi), )
for a, b in intervals:
    x=np.linspace(a + epsilon, b - epsilon, 50)
    y=np.cos(x) / np.sin(x)
    ax.plot(x/np.pi,y, color=color)

plt.title("f(x) = ctg(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.ylim([-4, 4])
ax.xaxis.set_major_formatter(mpl.ticker.FormatStrFormatter('%g $\pi$'))
plt.savefig('ctg')
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...