Python 显示截取值,matplotlib

Python 显示截取值,matplotlib,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在为几个频率绘制一些曲线ImaxvsCiclo de servicio 为此,我对自变量进行了两次嵌套扫描,Fs和Vo 虽然方程式有点复杂,但我基本上是这样做的: for Fs in np.linspace(70e3,200e3,4): Vo_sweep = np.linspace(0,1,1000) delta_I = [I_max(Vo) for Vo in Vo_sweep] plt.plot(Vo_sweep,delta_I) 我特别感兴趣的是‘cic

我正在为几个频率绘制一些曲线
Imax
vs
Ciclo de servicio

为此,我对自变量进行了两次嵌套扫描,
Fs
Vo

虽然方程式有点复杂,但我基本上是这样做的:

for Fs in np.linspace(70e3,200e3,4):
    Vo_sweep = np.linspace(0,1,1000)
     delta_I = [I_max(Vo) for Vo in Vo_sweep]
     plt.plot(Vo_sweep,delta_I)

我特别感兴趣的是‘ciclo de servicio’是0.71


如何显示每条曲线蓝线截取的X轴值0.71和Y值

如果您想使用任意数据绘制截取标记(无论函数和垂直线是什么),我建议您计算交点(存在交点的地方)。几个月前,我给出了一个可能对你有用的答案。你可以查一下

根据您的问题调整类似的解决方案:

import numpy as np
import matplotlib.pyplot as plt

def line_intersection(line1, line2):
    xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0])
    ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) #Typo was here

    def det(a, b):
        return a[0] * b[1] - a[1] * b[0]

    div = det(xdiff, ydiff)
    if div == 0:
        return None

    d = (det(*line1), det(*line2))
    x = det(d, xdiff) / div
    y = det(d, ydiff) / div
    return x, y

def near(a, b, rtol=1e-5, atol=1e-8):
    return abs(a - b) < (atol + rtol * abs(b))
def crosses(line1, line2):
    """
    Return True if line segment line1 intersects line segment line2 and 
    line1 and line2 are not parallel.
    """
    (x1,y1), (x2,y2) = line1
    (u1,v1), (u2,v2) = line2
    (a,b), (c,d) = (x2-x1, u1-u2), (y2-y1, v1-v2)
    e, f = u1-x1, v1-y1
    denom = float(a*d - b*c)
    if near(denom, 0):
        # parallel
        return False
    else:
        t = (e*d - b*f)/denom
        s = (a*f - e*c)/denom
        # When 0<=t<=1 and 0<=s<=1 the point of intersection occurs within the
        # line segments
        return 0<=t<=1 and 0<=s<=1


for Fs in np.linspace(70e3,200e3,4):
    Vo_sweep = np.linspace(0,1,1000)
    delta_I = [i*Fs*np.log((i+1.1)/10) for i in range(len(Vo_sweep))] #[I_max(Vo) for Vo in Vo_sweep]
    plt.plot(Vo_sweep,delta_I)

plt.vlines(0.71,min(delta_I),max(delta_I))

for Fs in np.linspace(70e3,200e3,4):
    x = np.linspace(0,1,1000)
    y = [i*Fs*np.log((i+1.1)/10) for i in range(len(Vo_sweep))]
    for i in range(1,len(delta_I)):
        p1 = np.array([x[i-1],y[i-1]],dtype='float')
        p2 = np.array([x[i],y[i]],dtype='float')
        k1 = np.array([0.71,min(delta_I)],dtype='float')
        k2 = np.array([0.71,max(delta_I)],dtype='float')
        if crosses((p2,p1),(k1,k2)):
            seg = line_intersection((p2,p1),(k1,k2))
            plt.scatter(seg[0],seg[1],c='red',s=90)
            print(seg)

plt.ylim(min(delta_I),max(delta_I))
plt.xlim(0,1)

plt.show()

由于您没有提供数据,我必须制作一个快速合成的数据,但在
delta\u I

的定义中,用
I\u max()
函数替换它应该很容易,这可能是一个愚蠢的问题,但是如果您的x轴的所有整数值都在0到1000之间(不知何故,您绘制为0到1.0),
x=0.71的y值不就是
I_max(709)
?然后可以使用注释(例如)将该值写入图形中。看这里:我同意@StefanS。通过构造,您已经知道每个函数在x=0.71时的值,或者最接近该值的x。因此,我的建议是将I_max(0.71)保存在一个列表中,然后在下面添加一个小面板,显示I_max(0.71)作为频率的函数。如果你有许多不同的曲线,这将给你一个安静的平滑函数,很容易理解。
(0.70999999999999985, 211670610.06954533)
(0.70999999999999985, 342704797.25546497)
(0.70999999999999985, 473738984.44138455)
(0.70999999999999985, 604773171.62730408)