Линия регрессии для диаграммы рассеяния holoviews? - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю график рассеяния из набора данных xarray, используя

scat = ds.hvplot.scatter(x='a', y='b', groupby='c', height=900, width=900)

Как добавить линию регрессии к этому графику?

Я также использую это для установки некоторыхиз свойств на графике, и я мог бы добавить Slope в функции ловушки, но я не могу понять, как получить доступ к x и y из plot.state.Это также может быть совершенно неправильным способом сделать это.

scat = scat.opts(hooks=[hook])

def hook(plot, element):
    print('plot.state:   ', plot.state)
    print('plot.handles: ', sorted(plot.handles.keys()))

    par = np.polyfit(x, y, 1, full=True)
    gradient=par[0][0]
    y_intercept=par[0][1]

    slope = Slope(gradient=gradient, y_intercept=y_intercept,
          line_color='orange', line_dash='dashed', line_width=3.5)

    plot.state.add_layout(slope)

scat = scat.opts(hooks=[hook])

1 Ответ

0 голосов
/ 21 февраля 2019

Сегментам заговора дается два аргумента, второй из которых - отображаемый элемент.Поскольку элемент содержит отображаемые данные, мы можем написать обратный вызов для вычисления наклона, используя метод dimension_values, чтобы получить значения измерений «a» и «b» в ваших данных.Кроме того, чтобы избежать многократного добавления глифа Slope, мы можем кэшировать его на графике и обновлять его атрибуты:

def hook(plot, element):
    x, y = element.dimension_values('a'), element.dimension_values('b')
    par = np.polyfit(x, y, 1, full=True)
    gradient=par[0][0]
    y_intercept=par[0][1]

    if 'slope' in plot.handles:
        slope = plot.handles['slope']
        slope.gradient = gradient
        slope.y_intercept = y_intercept
    else:

        slope = Slope(gradient=gradient, y_intercept=y_intercept,
              line_color='orange', line_dash='dashed', line_width=3.5)
        plot.handles['slope'] = slope
        plot.state.add_layout(slope)
...