如何在 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 中绘制斜率三角形?的主要内容,如果未能解决你的问题,请参考以下文章