Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 割线太长,尝试不使用y限制_Python_Matplotlib - Fatal编程技术网

Python 割线太长,尝试不使用y限制

Python 割线太长,尝试不使用y限制,python,matplotlib,Python,Matplotlib,我正在尝试使用python来自学calc的基础知识 我正在使用matplotlib pyplot跟踪函数曲线,然后从我指定的两点(p1和p2)绘制一条割线 我想我大部分的数学都还可以,但是如果我在Y轴上不使用极限(Y.min,Y.max of curve),那么割线有时会变得很长,并“压碎”我的曲线 我只是不确定限制直线的最佳数学方法是什么,这样它就不会超出曲线的最大或最小y值: 不设限制: 设置为曲线(Y.min,Y.max)的限制: 这是我的密码: import matplotlib.p

我正在尝试使用python来自学calc的基础知识

我正在使用matplotlib pyplot跟踪函数曲线,然后从我指定的两点(p1和p2)绘制一条割线

我想我大部分的数学都还可以,但是如果我在Y轴上不使用极限(Y.min,Y.max of curve),那么割线有时会变得很长,并“压碎”我的曲线

我只是不确定限制直线的最佳数学方法是什么,这样它就不会超出曲线的最大或最小y值:

不设限制:

设置为曲线(Y.min,Y.max)的限制:

这是我的密码:

import matplotlib.pyplot as plt
import numpy as np

ls = np.linspace(-2,2,100)
p1 = 2  #starts from zero
p2 = 50 #starts from zero

def draw_func(ls):
    x = ls
    y = x**2
    #y = (x**4-2*x**2+x)
    plt.plot(x,y)
    return y

x = ls
y = draw_func(ls)

x1 = x[p1]
x2 = x[p2]
y1 = y[p1]
y2 = y[p2]

m = (y2-y1) / (x2-x1)

delta_x = x2 - x1
delta_x = x1 + (delta_x/2)

b = y2 - y1
b = y1 + (b/2)

def draw_line(ls, m, b):
    x = ls
    y = (m * (x-delta_x)) + b
    plt.plot(x,y)

draw_line(ls, m, b)

plt.ylim(y.min(),y.max()) #This Is What I Was Hoping To Avoid

plt.show()

可以计算曲线顶点的坐标。从起点到该x值画一条线,而不是继续整个范围。

您可以采取几种不同的方法

一种是只画一部分割线。您可以在任何地方对其进行求值,并过滤出比“主”曲线大或小得多的点,也可以计算更有限的范围对其进行求值

另一种方法是告诉matplotlib仅对“主”曲线进行自动缩放,而对另一条曲线不进行限制


首先,我将以稍微不同的方式编写您的示例。你做事的方式没有问题,但我觉得这种风格更具可读性:

import matplotlib.pyplot as plt
import numpy as np

def main():
    x = np.linspace(-2,2,100)
    p1 = 2  #starts from zero
    p2 = 50 #starts from zero

    y1 = main_func(x)
    y2 = calculate_secant(x, y1, p1, p2)
    plot(x, y1, y2)
    plt.show()

def main_func(x):
    return x**2

def calculate_secant(x, y, p1, p2):
    points = [p1, p2]
    m, b = np.polyfit(x[points], y[points], 1)
    return m * x + b

def plot(x, y1, y2):
    plt.plot(x, y1)
    plt.plot(x, y2)

main()
我们将得到一个“缩小”的图,这是你不想要的:


如果我们稍微更改
plot
函数,我们可以告诉matplotlib在绘制第二条直线时不要更改轴限制:

def plot(x, y1, y2):
    plt.plot(x, y1)
    plt.plot(x, y2, scalex=False, scaley=False)


或者,我们可以从绿线中屏蔽出明显大于蓝线的点(关键点是下面的第三条线,其他点是相同的,并根据上下文给出:

y1 = main_func(x)
y2 = calculate_secant(x, y1, p1, p2)
y2[y2 < y1] = np.nan
plot(x, y1, y2)
y1=main_func(x)
y2=计算_正割(x,y1,p1,p2)
y2[y2
这将产生(可能不需要,可能需要)的副作用,即剪掉两条线交叉的左侧: