精华内容
下载资源
问答
  • 效果如下:我们的目的是求得matplotlib中多个线条的交点位置以及坐标最直白的想法是求得两条线的交点值,但是这个线是多个点的连线,所以每条线的function是非常难得到的,就算得到了也非常难联立求解。于是我们选择...

    今天教大家搞事情。

    效果如下:

    833b486e354c43733c4453d67cdb800d.png

    我们的目的是求得matplotlib中多个线条的交点位置以及坐标

    最直白的想法是求得两条线的交点值,但是这个线是多个点的连线,所以每条线的function是非常难得到的,就算得到了也非常难联立求解。

    于是我们选择通过渐进的方式逐渐逼近交点。

    具体代码如下:

    简单版本

    先来个简单的函数:

    import numpy as np
    import matplotlib.pyplot as plt

    fig = plt.figure()
    ax = fig.add_subplot(111)

    x1 = [1,2,3,4,5,6,7,8]
    y1 = [20,100,50,120,55,240,50,25]
    x2 = [3,4,5,6,7,8,9]
    y2 = [25,35,14,67,88,44,120]

    ax.plot(x1, y1, color='lightblue',linewidth=3)
    ax.plot(x2, y2, color='darkgreen', marker='^')


    # Plot the cross point

    x3 = np.linspace(6, 7, 1000) # (6, 7) intersection range
    y1_new = np.linspace(240, 50, 1000) # (6, 7) corresponding to (240, 50) in y1
    y2_new = np.linspace(67, 88, 1000) # (6, 7) corresponding to (67, 88) in y2

    idx = np.argwhere(np.isclose(y1_new, y2_new, atol=0.1)).reshape(-1)
    ax.plot(x3[idx], y2_new[idx], 'ro')

    plt.show()

    这个函数需要我们先给出两条曲线相交处的大致y值,即代码中的

    x3 = np.linspace(6, 7, 1000)        # (6, 7) intersection range
    y1_new = np.linspace(240, 50, 1000) # (6, 7) corresponding to (240, 50) in y1
    y2_new = np.linspace(67, 88, 1000) # (6, 7) corresponding to (67, 88) in y2

    具体思想是将6-7对应的y1,y2值得出,然后分为1000段,使用np.isclose(y1_new, y2_new, atol=0.1)逐渐逼近。

    这个函数的作用是求得y1_newy2_new差值是否<0.1,如果小于则对应位置返回true。

    np.argwhere求得非0的index,即求得交点在6-7值中对应的位置。

    由于比例是相同的,所以这个index即适用于x,也适用于y1,y2.

    画出即可。

    智能版本

    下面放出更智能的版本:

    # -*- coding: UTF-8 -*-
    # 求曲线交点解决方案
    import sys
    if sys.getdefaultencoding() != 'utf-8':
    reload(sys)
    sys.setdefaultencoding('utf-8')

    import numpy as np
    import matplotlib.pyplot as plt

    fig = plt.figure()
    ax = fig.add_subplot(111)

    x1 = [1,2,3,4,5,6,7,8]
    y1 = [20,100,50,120,55,240,50,25]
    x2 = [3,4,5,6,7,8,9]
    y2 = [25,35,14,67,88,44,120]

    ax.plot(x1, y1, color='lightblue',linewidth=3)
    ax.plot(x2, y2, color='darkgreen', marker='^')

    # Get the common range, from `max(x1[0], x2[0])` to `min(x1[-1], x2[-1])`
    x_begin = max(x1[0], x2[0]) # 3
    x_end = min(x1[-1], x2[-1]) # 8

    # 选出两曲线被包含的区间(有可能一个曲线长)
    points1 = [t for t in zip(x1, y1) if x_begin<=t[0]<=x_end] # [(3, 50), (4, 120), (5, 55), (6, 240), (7, 50), (8, 25)]
    points2 = [t for t in zip(x2, y2) if x_begin<=t[0]<=x_end] # [(3, 25), (4, 35), (5, 14), (6, 67), (7, 88), (8, 44)]

    print(points1)
    idx = 0
    nrof_points = len(points1)
    while idx < nrof_points-1:
    # 将x1 - x2 之间的数据分段,如果两段直接没用相交的部分那么跳到下一个
    x3 = np.linspace(points1[idx][0], points1[idx+1][0], 1000) # e.g., (6, 7) intersection range
    y1_new = np.linspace(points1[idx][1], points1[idx+1][1], 1000) # e.g., (6, 7) corresponding to (240, 50) in y1
    y2_new = np.linspace(points2[idx][1], points2[idx+1][1], 1000) # e.g., (6, 7) corresponding to (67, 88) in y2

    tmp_idx = np.argwhere(np.isclose(y1_new, y2_new, atol=0.1)).reshape(-1)
    if tmp_idx:
    ax.plot(x3[tmp_idx], y2_new[tmp_idx], 'ro') # Plot the cross point

    idx += 1

    plt.show()

    该版本不需要用户提供y1,y2的range。其主要思想是从Xmin到Xmax逐个判断,直到找到交点。

    while idx < nrof_points-1:从这里开始循环,从x最开始,依次加一,没有交点就接着循环,有交点就标注出来。

    很简单吧哈哈哈哈

    代码参考:https://stackoverflow.com/questions/37576527/finding-the-point-of-intersection-of-two-line-graphs-drawn-in-matplotlib

    展开全文
  • matplotlib中求两条曲线的交点

    千次阅读 2019-02-18 15:31:23
    最近在工作中算法中遇到求两条曲线的交点的问题,开始在网上找了良久没找到什么可用的办法,后来自己就在再就在纸上画,发现一个简单的算法可以求出这些交点来。看下图就知道了, 就是按照几何来计算比例: 具体...

    最近在工作中算法中遇到求两条曲线的交点的问题,开始在网上找了良久没找到什么可用的办法,后来自己就在再就在纸上画,发现一个简单的算法可以求出这些交点来。看下图就知道了,
    在这里插入图片描述
    就是按照几何来计算比例:
    具体代码如下:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x1 = np.array([712,653,625,605,617,635,677,762,800,872,947,1025,1111,1218,1309, 500])
    y1 = np.array([2022,1876,1710,1544,1347,1309,1025,995,850,723,705,710,761,873,1050, 2000])
    
    x_start = np.min(x1)
    x_end = np.max(x1)+1
    
    x_line = x1.copy()
    y_line = x_line * 0.9 + 500
    
    y=y1-y_line
    nLen=len(x1)
    xzero=np.zeros((nLen,))
    yzero=np.zeros((nLen,))
    for i in range(nLen-1):
        if np.dot(y[i], y[i+1]) == 0:#   %等于0的情况
            if y[i]==0:
                xzero[i]=i
                yzero[i]=0
            if y[i+1] == 0:
                xzero[i+1]=i+1
                yzero[i+1]=0
        elif np.dot(y[i],y[i+1]) < 0:# %一定有交点,用一次插值
            yzero[i] = np.dot(abs(y[i]) * y_line[i+1] + abs(y[i+1])*y_line[i], 1/(abs(y[i+1])+abs(y[i])))
            xzero[i] = (yzero[i]-500)/0.9
        else:
            pass            
    
    for i in range(nLen):
        if xzero[i]==0 and (yzero[i]==0):#     %除掉不是交点的部分
            xzero[i]=np.nan
            yzero[i]=np.nan
    
    print(xzero)
    print(yzero)
    
    plt.plot(x1, y1, 'o-')
    plt.plot(x_line,y_line,xzero,yzero,'o')
    plt.show()
    

    结果如下:
    在这里插入图片描述

    展开全文
  • 我有两条曲线的x和y值列表,它们都有奇怪的形状,而且我没有任何函数。我需要做两件事:(1)绘制它并对曲线之间的区域进行着色,如下图所示;(2)找到曲线之间该着色区域的总面积。在matplotlib中,我可以用fill-...

    我有两条曲线的x和y值列表,它们都有奇怪的形状,而且我没有任何函数。我需要做两件事:(1)绘制它并对曲线之间的区域进行着色,如下图所示;(2)找到曲线之间该着色区域的总面积。

    在matplotlib中,我可以用fill-betweenx和fill-betweenx绘制和着色这些曲线之间的区域,但是我不知道如何计算它们之间的确切区域,特别是因为我没有任何这些曲线的函数。

    有什么想法吗?

    我到处找都找不到简单的解决办法。我很绝望,所以非常感谢你的帮助。

    非常感谢!

    avcBO.png

    编辑:为了以后的参考(如果有人遇到同样的问题),下面是我如何解决的(许多个月后):将每条曲线的第一个和最后一个节点/点连接在一起,形成一个形状怪异的大多边形,然后使用shapely自动计算多边形的面积,这是曲线之间的精确区域,不管它们走哪条路,也不管它们有多非线性。就像一个魔咒,已经跑了上千条曲线。:)

    这是我的代码:from shapely.geometry import Polygon

    x_y_curve1 = [(0.121,0.232),(2.898,4.554),(7.865,9.987)] #these are your points for curve 1 (I just put some random numbers)

    x_y_curve2 = [(1.221,1.232),(3.898,5.554),(8.865,7.987)] #these are your points for curve 2 (I just put some random numbers)

    polygon_points = [] #creates a empty list where we will append the points to create the polygon

    for xyvalue in x_y_curve1:

    polygon_points.append([xyvalue[0],xyvalue[1]]) #append all xy points for curve 1

    for xyvalue in x_y_curve2[::-1]:

    polygon_points.append([xyvalue[0],xyvalue[1]]) #append all xy points for curve 2 in the reverse order (from last point to first point)

    for xyvalue in x_y_curve1[0:1]:

    polygon_points.append([xyvalue[0],xyvalue[1]]) #append the first point in curve 1 again, to it "closes" the polygon

    polygon = Polygon(polygon_points)

    area = polygon.area

    print(area)

    展开全文
  • 对类似问题有一些先前的答案(例如...由于个原因,这不太理想:>轴的背景不能是透明的,因为它上面有一个填充的多边形> pcolormesh绘制速度相当慢,并且不能平滑插值.这是一个更多的工作,但有一种方法可以更快地...

    对类似问题有一些先前的答案(例如

    https://stackoverflow.com/a/22081678/325565),但他们建议采用次优方法.

    大多数先前的答案建议在pcolormesh填充上绘制白色多边形.由于两个原因,这不太理想:

    >轴的背景不能是透明的,因为它上面有一个填充的多边形

    > pcolormesh绘制速度相当慢,并且不能平滑插值.

    这是一个更多的工作,但有一种方法可以更快地绘制并提供更好的视觉效果:设置用imshow绘制的图像的剪辑路径.

    举个例子:

    import numpy as np

    import matplotlib.pyplot as plt

    import matplotlib.colors as mcolors

    from matplotlib.patches import Polygon

    np.random.seed(1977)

    def main():

    for _ in range(5):

    gradient_fill(*generate_data(100))

    plt.show()

    def generate_data(num):

    x = np.linspace(0, 100, num)

    y = np.random.normal(0, 1, num).cumsum()

    return x, y

    def gradient_fill(x, y, fill_color=None, ax=None, **kwargs):

    """

    Plot a line with a linear alpha gradient filled beneath it.

    Parameters

    ----------

    x, y : array-like

    The data values of the line.

    fill_color : a matplotlib color specifier (string, tuple) or None

    The color for the fill. If None, the color of the line will be used.

    ax : a matplotlib Axes instance

    The axes to plot on. If None, the current pyplot axes will be used.

    Additional arguments are passed on to matplotlib's ``plot`` function.

    Returns

    -------

    line : a Line2D instance

    The line plotted.

    im : an AxesImage instance

    The transparent gradient clipped to just the area beneath the curve.

    """

    if ax is None:

    ax = plt.gca()

    line, = ax.plot(x, y, **kwargs)

    if fill_color is None:

    fill_color = line.get_color()

    zorder = line.get_zorder()

    alpha = line.get_alpha()

    alpha = 1.0 if alpha is None else alpha

    z = np.empty((100, 1, 4), dtype=float)

    rgb = mcolors.colorConverter.to_rgb(fill_color)

    z[:,:,:3] = rgb

    z[:,:,-1] = np.linspace(0, alpha, 100)[:,None]

    xmin, xmax, ymin, ymax = x.min(), x.max(), y.min(), y.max()

    im = ax.imshow(z, aspect='auto', extent=[xmin, xmax, ymin, ymax],

    origin='lower', zorder=zorder)

    xy = np.column_stack([x, y])

    xy = np.vstack([[xmin, ymin], xy, [xmax, ymin], [xmin, ymin]])

    clip_path = Polygon(xy, facecolor='none', edgecolor='none', closed=True)

    ax.add_patch(clip_path)

    im.set_clip_path(clip_path)

    ax.autoscale(True)

    return line, im

    main()

    展开全文
  • fill_between和fill_betweenx函数的作用都是填充两条曲线之间的区域。其中 fill_between函数作用是填充两条水平曲线之间的区域。 fill_betweenx函数作用是填充两条垂直曲线之间的区域。 两者参数非常相似,仅数据...
  • 在许多情况下,来自其他答案的解决...更好的解决方案是使用专门设计的ConnectionPatch:import matplotlib.pyplot as pltfrom matplotlib.patches import ConnectionPatchimport numpy as npfig = plt.figure(figsiz...
  • 今天才发现这个问题,两条曲线的数据是一致的,但是画出来却不同步,存在错位,如下图所示: 对应的Code: def plot_deflection_local(name,label,data_frame): plt.rcParams['font.sans-serif'] = ['SimHei'] ...
  • 在import pandas as pdimport numpy as npfrom scipy import optimizefrom scipy import interpolateimport matplotlib.pyplot as pltdef find_intersections(x1, y1, x2, y2):x1 = np.asarray(x1)y1 = np.asarray...
  • matplotlib画图时,常常需要实现类功能,一类是在一个坐标轴上画多条曲线,能够清楚地看到多条曲线的对比情况。另一种情况是在同一个窗口的不同子图上画图,多用于呈现不同内容的曲线,没有对比关系的曲线图。...
  • 使用matplotlib在一张图上画多条曲线

    万次阅读 2020-03-21 21:59:50
    做数据分析,还有机器学习的收敛性,准确性分析时,往往需要将一些数据图形化,以曲线的形式显示出来,下面就介绍种方式来实现这个小问题,一种是object-oriented面向对象的,另一种是基于plt的。 下面这个方式是...
  • 前面学习了怎么样显示一条简单的数学曲线,是最简单的方式,也是最基本的...要显示多条曲线,首先要有多条曲线的数据,在这里使用下面的代码来构造两条曲线的数据: x = [20, 40, 60, 80, 100, 120, 140] y1 = [30.
  • import matplotlib.pyplot as plt import numpy as np def func(x): return 5+2*x+3*x**2-0.5*x**3 def fund(x): return 200-10*x #np.linspace()取x的值 x=np.linspace(-10,10,50) y=func(x) y1=fund(x) f
  • 这里我利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图:# -*- coding: UTF-8 -*-import numpy as npimport matplotlib as mplimport matplotlib.pyplot as plt#这里导入你自己的...
  • 4.6 两条曲线填充的面积图

    千次阅读 2015-08-05 19:07:03
    两条曲线填充的面积图,我是在 Python 的 Matplotlib 包教程中阅读的,当时就觉得 Excel 也能绘制。所 以,本节将以图 4-6-1 为例讲解两条曲线填充面积图的制作。
  • 如果只是删除中间的值,那么再显示曲线的时候,并不能达到这个目的,因为在删除中间数据的地方,它们还是会画一条连接线,除非分成两条曲线来显示。下文将介绍两种方法,既不用分成两条曲线显示,也不用删除就可以...
  • 如下所示:# -*- coding: utf-8 -*-"""Created on Thu Jun 07 09:17:40 2018@author: yjp"""import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.ticker import MultipleLocator, ...
  • 这篇文章利用的是matplotlib.pyplot.plot的工具来绘制折线图,这里先给出一个段代码和结果图:# -*- coding: UTF-8 -*-import numpy as npimport matplotlib as mplimport matplotlib.pyplot as plt#这里导入你自己...
  • 目的 ...分别绘制 y=0.99x+0.2y = 0.99 ^ x + 0.2y=0.99x+0.2 和 y=0.99xy = 0.99^xy=0.99x 两条曲线。 代码 版本 matplotlib 2.2.2 python 3.7 关键代码 semilogx() 函数的使用,要注意请勿对...
  • # 我们来显示验证和训练的损失曲线(见图 6-20)。 # # 代码清单 6-38 绘制结果 import matplotlib.pyplot as plt loss = history.history['loss'] val_loss = history.history['val_loss'] epochs = range(len...
  • matplotlib库详解

    2019-01-07 20:01:00
    先学习matplotlib两个方面的应用:多条曲线画在一张图里面、多条曲线画在不同的图里面 plt.plot(x,y,format_string,**kwargs),其中: x、y为两轴的数据 format_string为控制曲线的格式字串,如下: 1、多...
  • 概要:python的matplotlib作图很强大,本文教你用6种不同方式解决将多种数据曲线画到一起。问题:今天,老板又要一个数据报表,小明选择用 python来实现。“用matplotlib用来可视化。并且必须用不同颜色标志每个数据...
  • Matplotlib高级

    2019-01-16 19:54:19
    以某种颜色自动填充两条曲线的闭合区域. mp.fill_between( x, # x轴水平坐标 sinx, # sinx曲线的y坐标 cosx, # cosx曲线的y坐标 sinx &amp;amp;amp;lt; cosx, # 填充条件为True时,执行填充操作 ...
  • Matplotlib填图

    2021-04-12 20:07:36
    填充两条曲线之间的部分 # 填图 fig,axes = plt.subplots(2,1,figsize = (8,6)) x = np.linspace(0, 1, 500) y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x) y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x) axes[0]...
  • matplotlib绘制图例

    千次阅读 2019-09-13 18:30:26
    本文以两条曲线为例,为其绘制图例。 import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=2*x+1 y2=x**2 plt.figure() plt.xlim((-1,2))#设置x坐标轴范围 plt.ylim((-2,3)) new...
  • 使用matplotlib完成绘制y1=...在同一平面坐标系上绘制上面两条曲线,采用不同的线型和不同的颜色区分两条曲线,同时,要分别用图例标出两条曲线; x、y轴包含标签,图表正上方有标题“使用matplotlib绘图(制作人:XX

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

matplotlib两条曲线