【问题标题】:Plot shows wrong points in Jupyter绘图显示 Jupyter 中的错误点
【发布时间】:2019-04-07 22:55:14
【问题描述】:

我正在做一个 Python 测试来绘制一些函数。

问题在于两个函数在同一个 X 处相交的点不正确。


import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.arange(-10,10,1)

def f(x): 
    return x+30

def z(x):
    return x*x

plt.figure(figsize=(5,5))
plt.plot(x, f(x).astype(np.int))
plt.plot(x, z(x).astype(np.int))
plt.title("Gráfico de función" )
plt.xlabel("X")
plt.ylabel("Y")

idx = np.argwhere(np.diff(np.sign(f(x) - z(x)))).flatten()
plt.plot(x[idx], f(x[idx]), 'ro')

plt.legend(["F","Z"])

plt.show()

我预计只有两点,但在剧情中出现了四点。其中有两个是错误的。

【问题讨论】:

    标签: python python-3.x jupyter-notebook jupyter


    【解决方案1】:

    此错误与绘图本身无关,而是与当交点为整数值时获取这种情况下的点的方法有关。当采用 np.sign 的 np.diff 时,您在交叉点处从 -1 到 0 到 1,在 4 个位置为您提供 1。如果交集不是 int,您将得到 -1 到 1 并得到正确答案。如果您尝试这样做,您可以找到整数交点:

    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    x = np.arange(-10,10,1)
    
    def f(x): 
        return x+30.
    
    def z(x):
        return x*x
    
    plt.figure(figsize=(5,5))
    plt.plot(x, f(x).astype(np.int))
    plt.plot(x, z(x).astype(np.int))
    plt.xlabel("X")
    plt.ylabel("Y")
    
    #Say only get args where there is no sign (i.e. zero).
    idx = np.argwhere((np.sign(f(x) - z(x))==0)) 
    
    plt.plot(x[idx], f(x[idx]), 'ro')
    
    plt.legend(["F","Z"])
    plt.show()
    

    编辑: 上面的代码只有在你有完美的整数交集时才有效。要任意执行这两种操作,您需要在决定使用哪种方法之前检查是否存在完美的整数交集。我只是使用了一个简单的for 循环来执行此操作,但我相信还有更优雅的方法可以执行此操作。

    for v in np.sign(f(x) - z(x)):
        if v==0:
            idx = np.argwhere(np.sign(f(x) - z(x))==0)
            break
        else:
            idx = np.argwhere(np.diff(np.sign(f(x) - z(x))))
    

    【讨论】:

    • 适用于多种情况。例如对于 def f(x): return -4*x+1000 def z(x): return 2*x*x 在这种情况下,绘图不显示点。为什么可以?谢谢
    • 那是因为现在你没有完美的交点整数值
    • 我对答案进行了疯狂的编辑。错误是由于完美的整数交点造成的,因为有一个零,所以它会给你额外的交点。
    • 嗨。我试过你写的代码,但没有用。这是一个屏幕截图。 [链接] (imgur.com/U25sb7d)
    • 所以代码可以正常工作并且完全按照它应该做的那样工作。现在的问题是您的绘图具有非常大的斜率,并且您的 x 分辨率太低而无法准确处理。如果您在x=np.arange(-10,10,.01) 中使用 .01 而不是 1,您将看到正确答案的结果。
    猜你喜欢
    • 2014-03-20
    • 2017-05-11
    • 2020-07-22
    • 2021-01-19
    • 2019-12-04
    • 2019-03-17
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多