Страницы

Поиск по вопросам

среда, 13 марта 2019 г.

Python matplotlib Построение гиперболы

Добрый день! Хочу при помощи 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

Комментариев нет:

Отправить комментарий