如何在 matplotlib 中绘制斜率三角形?

Posted

技术标签:

【中文标题】如何在 matplotlib 中绘制斜率三角形?【英文标题】:How to draw slope triangles in 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

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

【问题讨论】:

【参考方案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()

输出:

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

希望有帮助!

【讨论】:

以上是关于如何在 matplotlib 中绘制斜率三角形?的主要内容,如果未能解决你的问题,请参考以下文章

python怎么画三角形

是否可以使用 matplotlib 在地图上绘制图像?

使用 pandas 或 matplotlib 在 IPython 笔记本中绘制性别图表

Python中Matplotlib的点、线形状及颜色

用于绘制三元/三角形图的库/工具 [关闭]

python+matplotlib 绘制等高线