在Matplotlib中添加描述交点的线

时间:2016-05-08 20:17:07

标签: python matplotlib

我有以下代码:

plt.figure(figsize=(12,8))

plt.plot(range(0, 60), cum_var,'g--', label='explained ratio')
plt.plot(range(0, 60), 1 - cum_var, 'r--', label='error ratio')

thre_95 = 0.95 * np.ones(60)
thre_99 = 0.99 * np.ones(60)
plt.plot(range(0, 60), thre_95, 'k_', label='0.95 threshold')
plt.plot(range(0, 60), thre_99, 'k_', label='0.99 threshold')

idx = np.argwhere(np.isclose(thre_95, cum_var, atol=0.001)).reshape(-1)
idx[0] += 1
plt.plot(idx, thre_95[idx], 'ro')

idx = np.argwhere(np.isclose(thre_99, cum_var, atol=0.0005)).reshape(-1)
idx[0] += 1
plt.plot(idx, thre_99[idx], 'ro')

plt.legend(loc='center right')
plt.xlabel('Reduced Dimensionality')
plt.ylabel('Variance Ratio')
plt.title('Explained Ratio Curve')
plt.axis([0, 60, 0, 1])
plt.grid(True)
plt.show()

绘制下图:

enter image description here

现在我需要从交点向下添加x线和y线,以便清楚地显示交点。我该怎么做?

编辑:我得到了答案并设法画线,现在我的问题是如何使添加的线的x值出现在轴上?

另一个编辑:找到Answer for edit question

1 个答案:

答案 0 :(得分:0)

嗯,您需要找到两个函数(y_1 = cum_vary_2 = 1 - cum_var)交叉的位置。因为其中一个是一个减去另一个,我们知道当它们交叉时它们的值是0.5。所以我们可以做点什么,

# Find the index at which `cum_var` is nearest to 0.5
ind_cross = np.argmin(np.fabs(cum_var - 0.5))
# Plot vertical line there
plt.axvline(ind_cross, color='0.5', ls=':')

如果你只希望线路到达他们穿越的地方,你可以这样做,

plt.axvline(ind_cross, ymin=0, ymax=0.5, color='0.5', ls=':')

如果你想让这个更加精确,那么你可以创建一个插值并找到<,而不只是找到cum_var 最接近 的位置为0.5。 em>完全它越过0.5(这称为'寻根'),即:

import scipy as sp
import scipy.interpolate
import scipy.optimize

# Create interpolation function from y-vales to x-vales
interp_func = sp.interpolate.interp1d(cum_var, np.arange(60))
# Find the root (so that interp_func(root) = 0.5)
root = sp.optimize.root(lamda xx: interp_func(xx) - 0.5, 4)