Добрый день! Хочу при помощи matplotlib построить, например, гиперболу. Есть следующий код:
import matplotlib.pyplot as plt
import pylab, math
xmin = -200
xmax = 200
dx = 0.1
xlist = [float(x) for x in range(xmin,xmax)]
ylist = [float(1/x) for x in range(xmin,xmax)]
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
plt.grid(True)
plt.title('График функции ')
pylab.plot(xlist,ylist)
pylab.savefig('123.png')
Пример работы на картинке
Как видно, между двумя ветвями функции есть отрезок. Я знаю, что это связанно с тем, что есть значение крайних точек ветвей, а плот их соединяет. Но это мне не нужно, мне нужно получить нормальный график. Если бы этот график был всегда гиперболой, было бы нормально. Но этим графиком может быть любой график с разрывом. Как избежать этого отрезка? Видел способы, но там использовались дополнительные пакеты(numpy), я не хочу тянуть их в этот код
[]
Ответ
Для начала повторюсь, что matplotlib уже внутри себя использует numpy, так что избежать его не выйдет. Тем не менее, вот первая версия без numpy в основном коде:
import matplotlib.pyplot as plt
import decimal
# Это замена np.arange
def arange(start, stop, step):
while start < stop:
yield start
start += decimal.Decimal(step)
hyperbola = lambda x: 1 / x
def asymptote_checker(argument, function):
try:
function(argument)
return True
except ZeroDivisionError:
return False
xmin = -20
xmax = 20
dx = 0.1
xlist = [round(x, 4) for x in arange(xmin, xmax, dx)]
ylist = [hyperbola(x) if asymptote_checker(x, hyperbola) else float('nan') for x in xlist]
plt.plot(xlist, ylist)
plt.show()
С numpy выйдет покороче:
import matplotlib.pyplot as plt
import decimal
import numpy as np
xmin = -20
xmax = 20
dx = 0.1
xlist = np.around(np.arange(xmin, xmax, dx), decimals=4)
ylist = 1 / xlist
plt.plot(xlist, ylist)
plt.show()
Пара общих важных моментов для обеих версий: числа в xlist вместо нуля могут внезапно превратиться в мусор типа 7.0485345e-13 или типа того, что выльется в огромное значение по оси Oy. Второй момент - matplotlib игнорирует (и не соединяет точки) числа типа +inf, -inf, NaN - их можно пометить руками, доверить это numpy или использовать numpy masked array
Комментариев нет:
Отправить комментарий