Приведенный ниже код состоит из графика matplotlib функции y > 5/x с возможностью заполнения графика при панорамировании или масштабировании пользователем.
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
x_range = np.linspace(-10, 10, 400)
y_range = 5 / x_range
line, = ax.plot(x_range, y_range, 'r', linewidth=2, linestyle='--')
ax.fill_between(x_range, y_range, y_range.max(), alpha=0.3, color='gray')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_title('Inequality: y > 5 / x')
ax.axhline(0, color='black',linewidth=3)
ax.axvline(0, color='black',linewidth=3)
ax.grid(color='gray', linestyle='--', linewidth=0.5)
def update_limits(event):
xlim = ax.get_xlim()
x_range = np.linspace(xlim[0], xlim[1], max(200, int(200 * (xlim[1] - xlim[0]))))
y_range = 5 / x_range
line.set_data(x_range, y_range)
for collection in ax.collections:
collection.remove()
ax.fill_between(x_range, y_range, max(y_range.max(), ax.get_ylim()[1]), alpha=0.3, color='gray')
plt.draw()
fig.canvas.mpl_connect('button_release_event', update_limits)
plt.show()
Я пытался преобразовать эту концепцию в код, использующий модуль Sympy (путем доступа к бэкэнду Matplotlib), который лучше контролирует алгебраические функции. Однако следующий код ниже, похоже, не заполняет график, когда пользователь перемещается наружу. Почему это так и как это исправить?
import sympy as sp
from sympy.plotting.plot import MatplotlibBackend
x, y = sp.symbols('x y')
# Define the implicit plot
p1 = sp.plot_implicit(sp.And(y > 5 / x), (x, -10, 10), (y, -10, 10), show=False)
mplPlot = MatplotlibBackend(p1)
mplPlot.process_series()
mplPlot.fig.tight_layout()
mplPlot.ax[0].set_xlabel("x-axis")
mplPlot.ax[0].set_ylabel("y-axis")
def update_limits(event):
global mplPlot
xmin, xmax = mplPlot.ax[0].get_xlim()
ymin, ymax = mplPlot.ax[0].get_ylim()
p1 = sp.plot_implicit(sp.And(y > 5 / x), (x, xmin, xmax), (y, ymin, ymax), show=False)
mplPlot = MatplotlibBackend(p1)
mplPlot.process_series()
mplPlot.fig.tight_layout()
mplPlot.ax[0].set_xlabel("x-axis")
mplPlot.ax[0].set_ylabel("y-axis")
mplPlot.plt.draw()
mplPlot.fig.canvas.mpl_connect('button_release_event', update_limits)
mplPlot.plt.show()
Подробнее здесь: https://stackoverflow.com/questions/782 ... sympy-plot