【问题标题】:How to draw slope triangles in matplotlib?如何在 matplotlib 中绘制斜率三角形?
【发布时间】:2020-03-05 00:33:27
【问题描述】:

我想要的是如图所示的三角形:

这是我的代码:

import matplotlib.pyplot as plt
data= [0.2855,0.3030,0.4995]
x = [1,2,3]
plt.plot(x, data)
plt.show

有没有一种简单的方法可以自动插入这些斜率三角形,如图所示?我想让三角形位于两点之间的中间,并在旁边写上斜率。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    三角形的构造也可以使用mpltools:

    import matplotlib.pyplot as plt
    from mpltools import annotation
    import numpy as np
    
    data = [0.2855, 0.3030, 0.4995]
    x = [1, 2, 3]
    
    # get midpoint coordinates
    x_mid = np.convolve(x, [0.5, 0.5], mode='valid')
    y_mid = np.interp(x_mid, x, data)
    
    # compute the gradient of each segment
    gradients = np.diff(data)/np.diff(x)
    
    # plot
    plt.plot(x, data)
    axes = plt.gca()
    for xm, ym, g in zip(x_mid, y_mid, gradients):
        annotation.slope_marker((xm, ym), g)
    plt.show()
    

    annotation.slope_marker 的第一个参数是一个包含三角形左角坐标的元组,第二个参数是梯度。因此,在这里我们遍历线段的中点及其渐变,并在这些坐标处为该渐变使用三角形斜率标记进行注释。

    预期输出:

    【讨论】:

    • 您的答案可以通过添加有关代码的作用以及它如何帮助 OP 的更多信息来改进。
    • 感谢您的建议,我添加了更多文字。希望它有用。
    【解决方案2】:

    根据您对“自动时尚”的想法,这可能是一个合适的解决方案:

    import matplotlib.pyplot as plt
    import numpy as np
    
    # Data
    x = np.array([1, 2, 3])
    y = np.array([0.2855, 0.3030, 0.4995])
    
    # Calculate triangle coordinates values
    x_mid = np.convolve(x, [0.5, 0.5], mode='valid')
    x_tri = np.vstack((x_mid, x_mid + 0.3))
    y_tri = np.interp(x_tri, x, y)
    
    # Calculate slopes
    slopes = np.diff(y) / np.diff(x)
    
    # Plot
    plt.plot(x, y)
    plt.plot(x_tri, np.tile(y_tri[0, :], [2, 1]), 'r')      # red horizontal line
    plt.plot(np.tile(x_tri[1, :], [2, 1]), y_tri, 'r')      # red vertical line
    for i, slope in enumerate(slopes):                      # slope values
        plt.text(x_tri[1, i] + 0.05, np.mean(y_tri[:, i]), r'{0:.3f}'.format(slope))
    plt.show()
    

    输出:

    将所有三角形的东西放在一个单独的函数中,它不会对你的主代码影响太大。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2021-02-14
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      相关资源
      最近更新 更多