【问题标题】:Plot arbitrary 2-D function in python/pyplot like Matlab's Ezplot在 python/pyplot 中绘制任意二维函数,如 Matlab 的 Ezplot
【发布时间】:2016-01-09 17:23:24
【问题描述】:

我正在寻找一种方法来生成类似于 ezplot 在 MATLAB 中的工作方式的绘图,因为我可以输入:

ezplot('x^2 + y^2 = y + 5')

并准备好用于任意函数的图形。我只担心我同时有 x 和 y 的情况。

我只有这个函数,如果没有必要,我真的不想尝试计算某个给定 x 范围的所有 y 值。

我看到的少数解决方案要么是关于决策边界(这不是。没有测试数据或任何东西,只是一个任意函数),要么都是针对已经定义为 y = some x equation 的函数真的帮不了我。

如果有一种在求解功能中模仿 Wolfram|Alpha 的好方法,我会有点接受(“求解 x^2 + y^2 = y + 5 for y”会给我两个函数,然后我可以分别绘制图形) ,但更喜欢 ezplot,因为它在 MATLAB 中或多或少是即时的。

【问题讨论】:

    标签: python matlab matplotlib


    【解决方案1】:

    我认为您可以为此使用 sympy plotting 和 parse_expr 对于您的示例,这将按如下方式工作

    from sympy.plotting import plot_implicit
    from sympy.parsing.sympy_parser import parse_expr
    
    def ezplot(s):
        #Parse doesn't parse = sign so split
        lhs, rhs = s.replace("^","**").split("=")
        eqn_lhs = parse_expr(lhs)
        eqn_rhs = parse_expr(rhs)
    
        plot_implicit(eqn_lhs-eqn_rhs)
    
    ezplot('x^2 + y^2 = y + 5')
    

    这可以根据需要进行通用

    【讨论】:

      【解决方案2】:

      您可以使用 sympy 求解方程,然后使用生成的函数在 x 上绘制 y:

      import sympy
      
      x=sympy.Symbol('x')
      y=sympy.Symbol('y')
      f = sympy.solve(x**2 + y**2 - y - 5, [y])
      print f
      xpts = (numpy.arange(10.)-5)/10
      ypts = sympy.lambdify(x, f, 'numpy')(xpts)
      
      # then e.g.: pylab.scatter(xpts, ypts)
      

      【讨论】:

        【解决方案3】:

        @EdSmith 解决方案工作正常。不过,我还有另一个建议。您可以使用绘制轮廓。你可以将你的函数重写为f(x, y)=0,然后使用这段代码

        from numpy import mgrid, pi
        import matplotlib.pyplot as plt
        
        def ezplot(f):
            x, y = mgrid[-2*pi:2*pi:51, -2*pi:2*pi:51]
            z = f(x, y)
            ezplt = plt.contour(x, y, f, 0, colors='k')
            return ezplt
        

        这是主要思想。当然你也可以将其泛化为MATLAB中的函数,比如xy的一般区间,将函数作为字符串传递等等。

        【讨论】:

          猜你喜欢
          • 2014-08-15
          • 1970-01-01
          • 2015-08-02
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          • 2016-03-26
          • 2014-12-17
          • 1970-01-01
          相关资源
          最近更新 更多