是否有可能使用Matplotlib绘制隐式方程?

我想绘制Matplotlib中的隐式方程(forms为f(x,y)= g(x,y),例如X ^ y = y ^ x)。 这可能吗?

我不相信这有很好的支持,但你可以尝试类似的东西

import matplotlib.pyplot from numpy import arange from numpy import meshgrid delta = 0.025 xrange = arange(-5.0, 20.0, delta) yrange = arange(-5.0, 20.0, delta) X, Y = meshgrid(xrange,yrange) # F is one side of the equation, G is the other F = Y**X G = X**Y matplotlib.pyplot.contour(X, Y, (F - G), [0]) matplotlib.pyplot.show() 

查看contour的API文档 :如果第四个参数是一个序列,那么它指定要绘制哪条轮廓线。 但是这个情节只会和你的范围的分辨率一样好,而且有些特征往往在自我交叉点上可能永远不会正确。

既然你用sympy标记了这个问题,我会举这个例子。

从文档: http : //docs.sympy.org/modules/plotting.html 。

 from sympy import var, Plot var('x y') Plot(x*y**3 - y*x**3) 

matplotlib不绘制方程; 它绘制点的系列。 您可以使用像scipy​.optimize这样的工具,根据数值计算隐式方程的x值(反之亦然),或根据需要任意数量的其他工具,从数值上计算y点。


例如,下面是一个例子,其中我绘制了某个区域内的隐式方程x ** 2 + x * y + y ** 2 = 10

 from functools import partial import numpy import scipy.optimize import matplotlib.pyplot as pp def z(x, y): return x ** 2 + x * y + y ** 2 - 10 x_window = 0, 5 y_window = 0, 5 xs = [] ys = [] for x in numpy.linspace(*x_window, num=200): try: # A more efficient technique would use the last-found-y-value as a # starting point y = scipy.optimize.brentq(partial(z, x), *y_window) except ValueError: # Should we not be able to find a solution in this window. pass else: xs.append(x) ys.append(y) pp.plot(xs, ys) pp.xlim(*x_window) pp.ylim(*y_window) pp.show() 

在sympy的开发版本中有一个隐含的等式(和不等式)绘图仪。 它是作为GSoC的一部分创build的,它产生的图像是matplotlib figure实例。

在sympy(0.7.2)的下一个版本中,它将以下列forms提供:

 >>> from sympy.plotting import plot_implicit >>> p = plot_implicit(x < sin(x)) # also creates a window with the plot >>> the_matplotlib_axes_instance = p._backend._ax 

我将在发布时更新这个post。

如果你愿意使用除matplotlib(但仍然是python)之外的东西,那就是圣人:

一个例子: http : //sagenb.org/home/pub/1806

有关implicit_plot的文档

贤者主页

非常感谢Steve,Mike,Alex。 我已经和史蒂夫的解决scheme一起(请参阅下面的代码)。 我唯一剩下的问题是等高线图出现在我的网格线后面,而不是一个规则的情节,我可以强迫zorder前面。 更多halp非常感谢。

干杯,Geddes

 import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator, FormatStrFormatter import numpy as np fig = plt.figure(1) ax = fig.add_subplot(111) # set up axis ax.spines['left'].set_position('zero') ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') # setup x and y ranges and precision x = np.arange(-0.5,5.5,0.01) y = np.arange(-0.5,5.5,0.01) # draw a curve line, = ax.plot(x, x**2,zorder=100) # draw a contour X,Y=np.meshgrid(x,y) F=X**Y G=Y**X ax.contour(X,Y,(FG),[0],zorder=100) #set bounds ax.set_xbound(-1,7) ax.set_ybound(-1,7) #produce gridlines of different colors/widths ax.xaxis.set_minor_locator(MultipleLocator(0.2)) ax.yaxis.set_minor_locator(MultipleLocator(0.2)) ax.xaxis.grid(True,'minor',linestyle='-') ax.yaxis.grid(True,'minor',linestyle='-') minor_grid_lines = [tick.gridline for tick in ax.xaxis.get_minor_ticks()] for idx,loc in enumerate(ax.xaxis.get_minorticklocs()): if loc % 2.0 == 0: minor_grid_lines[idx].set_color('0.3') minor_grid_lines[idx].set_linewidth(2) elif loc % 1.0 == 0: minor_grid_lines[idx].set_c('0.5') minor_grid_lines[idx].set_linewidth(1) else: minor_grid_lines[idx].set_c('0.7') minor_grid_lines[idx].set_linewidth(1) minor_grid_lines = [tick.gridline for tick in ax.yaxis.get_minor_ticks()] for idx,loc in enumerate(ax.yaxis.get_minorticklocs()): if loc % 2.0 == 0: minor_grid_lines[idx].set_color('0.3') minor_grid_lines[idx].set_linewidth(2) elif loc % 1.0 == 0: minor_grid_lines[idx].set_c('0.5') minor_grid_lines[idx].set_linewidth(1) else: minor_grid_lines[idx].set_c('0.7') minor_grid_lines[idx].set_linewidth(1) plt.show()