是否可以绘制隐式方程?
我想在 Matplotlib 中绘制隐式方程(形式为 f(x, y)=g(x, y) 例如 X^y=y^x)。这可能吗?
I would like to plot implicit equations (of the form f(x, y)=g(x, y) eg. X^y=y^x) in Matplotlib. Is this possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
既然你用 sympy 标记了这个问题,我就举一个这样的例子。
来自文档: http://docs.sympy.org/latest/modules/plotting.html 。
Since you've tagged this question with sympy, I will give such an example.
From the documentation: http://docs.sympy.org/latest/modules/plotting.html.
我不相信对此有很好的支持,但您可以尝试类似的方法,
请参阅 API docs for
contour
:如果第四个参数是一个序列,那么它指定要绘制哪些等高线。但绘图的好坏取决于范围的分辨率,并且某些特征可能永远不会正确,通常是在自交点处。I don't believe there's very good support for this, but you could try something like
See the API docs for
contour
: if the fourth argument is a sequence then it specifies which contour lines to plot. But the plot will only be as good as the resolution of your ranges, and there are certain features it may never get right, often at self-intersection points.matplotlib 不绘制方程;它绘制一系列点。您可以使用诸如 scipy .optimize 之类的工具,根据隐式方程的 x 值(反之亦然)以数字方式计算 y 点,或者使用任意数量的其他适当工具。
例如,下面是我在某个区域绘制隐式方程
x ** 2 + x * y + y ** 2 = 10
的示例。matplotlib does not plot equations; it plots serieses of points. You can use a tool like
scipy.optimize
to numerically calculate y points from x values (or vice versa) of implicit equations numerically or any number of other tools as appropriate.For example, here is an example where I plot the implicit equation
x ** 2 + x * y + y ** 2 = 10
in a certain region.sympy 中有一个隐式方程(和不等式)绘图仪。它是作为 GSoC 的一部分创建的,并以 matplotlib 图实例的形式生成绘图。
文档位于 http://docs.sympy.org/ latest/modules/plotting.html#sympy.plotting.plot_implicit.plot_implicit
自 sympy 版本 0.7.2 起,它可用作:
There is an implicit equation (and inequality) plotter in sympy. It is created as a part of GSoC and it produces the plots as matplotlib figure instances.
Docs at http://docs.sympy.org/latest/modules/plotting.html#sympy.plotting.plot_implicit.plot_implicit
Since sympy version 0.7.2 it is available as:
编辑:如果您使用 plt.plot() 绘制双曲线,那么您将得到不需要的分支效果。 plt.scatter() 代替它应该仍然有效。那么就不需要颠倒负值或正值的顺序,但是如果您出于某种原因想使用此代码(而不是使用 scipy 中的等高线图),它无论如何都可以与 plt.scatter() 一起使用,
一个隐式函数分为两个一般来说,维度可以写为:
f(x,y)=0
由于我们不能将其写为 f(x) = y,因此我们无法从一组易于编程的离散 x 中计算 y。然而,可以看到从网格生成的点与真实函数的接近程度。
因此,将 x 和 y 的网格设置为自定义点密度,然后查看每个点与满足方程的接近程度。
换句话说,如果我们不能得到 f(x,y) =0,也许我们可以接近 0。不是寻找 f(x,y) =0,而是寻找 f(x,y) > 。 -\epsilon 和 f(x,y) < \epsilon。
\epsilon 是您的容差,如果此条件符合您的容差 0 并适当调整网格,您就可以绘制函数。
下面的代码仅针对半径为 1 的圆执行此操作 (f(x,y)= x^2 + y^2 -1 = 0)。我使用符号 dr 来表示 \epsilon。
另外,为了确保 plt.plot 函数以正确的顺序连接线条,我使用 x 值的反转版本作为负 y 值。这样,f(x,y) 的计算是按顺时针循环完成的,以便最接近的值一个接一个地出现。如果没有这个,函数相对两侧的线条就会连接起来,并且看起来会稍微填充。
Edit: If you plot a hyperbola using plt.plot() then you will get the undesired branching effect. plt.scatter() in its place should still work. Then there is no need to reverse the order of negative or positive values, but if you wanted to use this code for some reason (instead of using contour plot from scipy) it will work anyways with plt.scatter()
An implicit function in two dimensions in general can be written as:
f(x,y)=0
Since we cannot write this as f(x) = y, then we cannot compute y from an easily programmable set of discrete x. It is possible, however, to see how close a point generated from a grid is from the true function.
So make a grid of x and y to a custom point density and see how close each point is to satisfying the equation.
In other words, if we can't get f(x,y) =0, perhaps we can get close to 0. Instead of looking for f(x,y) =0 look for f(x,y) > -\epsilon and f(x,y) < \epsilon.
\epsilon is your tolerance and if this condition fits within your tolerance of 0 and tuning the grid appropriately you can get your function plotted.
The code below does just that for a circle of radius 1 (f(x,y)= x^2 + y^2 -1 = 0). I used the symbol dr for \epsilon.
Also, to make sure the plt.plot function connects the lines in the correct order, I use a reversed version of the x values for the negative y values. That way, the evaluation of f(x,y) is done in a clockwise loop so that the nearest values are one after another. Without this, lines from opposite sides of the function would connect and it would appear slightly filled in.
非常感谢史蒂夫、迈克、亚历克斯。我已经同意史蒂夫的解决方案(请参阅下面的代码)。我唯一剩下的问题是等值线图出现在网格线后面,而不是常规图,我可以使用 zorder 将其强制到前面。任何更多半非常感激。
干杯,
格德斯
Many thanks Steve, Mike, Alex. I have gone along with Steve's solution (please see code below). My only remaining issue is that the contour plot appears behind my gridlines, as opposed to a regular plot, which I can force to the front with zorder. Any more halp greatly appreciated.
Cheers,
Geddes