首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以圆滑的方式在多项式线中添加特定点的斜率?

如何以圆滑的方式在多项式线中添加特定点的斜率?
EN

Stack Overflow用户
提问于 2022-06-29 14:00:40
回答 1查看 359关注 0票数 1

假设我有一个多项式回归,看起来是这样的

类似于这样的代码:

代码语言:javascript
复制
fig = px.scatter(
    x=final_df.index,
    y=final_df.nr_deaths, 
    trendline="lowess", #ols
    trendline_color_override="red",
    trendline_options=dict(frac=0.1),
    opacity=.5,
    title='Deaths per year'
)
fig.show()

如何计算多项式回归线特定点上的斜率(=切线)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-29 14:00:40

目前,这不能仅靠一个人来完成。但是,您可以通过使用其他库来计算和应用图表中的结果来实现这一点。

这个问题的困难在于

    1. calculating多项式在某一point

上的斜率

    1. calculating x和y值,用于将它们绘制为lines

对于计算某个点的斜率,可以使用numpy功能。之后,您只需用python计算x和y值,然后用图形绘制它们。

代码语言:javascript
复制
poly_degree = 3


y = df.col.values
x = np.arange(0, len(y))
x = x.reshape(-1, 1)

fitted_params = np.polyfit(np.arange(0, len(y)), y, poly_degree )

polynomials = np.poly1d(fitted_params)

derivatives = np.polyder(polynomials)

y_value_at_point = polynomials(x).flatten()

slope_at_point = np.polyval(derivatives, np.arange(0, len(y)))

为了在一个点上计算相应的斜率值(所需的x值和y值),并巧妙地绘制它,您可以这样做:

代码语言:javascript
复制
def draw_slope_line_at_point(fig, ind, x, y, slope_at_point, verbose=False):
    """Plot a line from an index at a specific point for x values, y values and their slopes"""
    
    
    y_low = (x[0] - x[ind]) * slope_at_point[ind] + y[ind]
    y_high = (x[-1] - x[ind]) * slope_at_point[ind] + y[ind]
    
    x_vals = [x[0], x[-1]]
    y_vals = [y_low, y_high]

    if verbose:
        print((x[0] - x[ind]))
        print(x[ind], x_vals, y_vals, y[ind],slope_at_point[ind])
    
    fig.add_trace(
            go.Scatter(
                x=x_vals, 
                y=y_vals, 
                name="Tangent at point", 
                line = dict(color='orange', width=2, dash='dash'),
            )
        )
    
    return x_vals, y_vals

调用它并添加注释如下所示:

代码语言:javascript
复制
for pt in [31]:
    draw_slope_line_at_point(
        fig, 
        x= np.arange(0, len(y)),
        y = y_value_at_point,
        slope_at_point=slope_at_point,
        ind = pt)
    
    fig.add_annotation(x=pt, y=y_value_at_point[pt],
            text=f'''Slope: {slope_at_point[pt]:.2f}\t {df.date.strftime('%Y-%m-%d')[pt]}''',
            showarrow=True,
            arrowhead=1)

结果如下:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72802695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档