我有以下代码:
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()
绘制下图:
现在我需要从交点向下添加x线和y线,以便清楚地显示交点。我该怎么做?
编辑:我得到了答案并设法画线,现在我的问题是如何使添加的线的x值出现在轴上?
另一个编辑:找到Answer for edit question
答案 0 :(得分:0)
嗯,您需要找到两个函数(y_1 = cum_var
和y_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)