Построение таймсерий с использованием mpld3 - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь построить данные временного ряда, подобные random_walk: https://mpld3.github.io/examples/random_walk.html.

График будет состоять из score, сгруппированных по name на date/year поле и выделите пертикулярную линию при наведении курсора. В настоящее время он выделяет весь график при наведении.

Любая помощь будет принята с благодарностью.

Ниже приведен пример кода.

import jinja2
import json
import numpy as np
import matplotlib.pyplot as plt
import mpld3
from mpld3 import plugins, utils
import pandas as pd

class HighlightLines(plugins.PluginBase):
    """A plugin to highlight lines on hover"""
    JAVASCRIPT = """
    mpld3.register_plugin("linehighlight", LineHighlightPlugin);
    LineHighlightPlugin.prototype = Object.create(mpld3.Plugin.prototype);
    LineHighlightPlugin.prototype.constructor = LineHighlightPlugin;
    LineHighlightPlugin.prototype.requiredProps = ["line_ids"];
    LineHighlightPlugin.prototype.defaultProps = {alpha_bg:0.3, alpha_fg:1.0}
    function LineHighlightPlugin(fig, props){
        mpld3.Plugin.call(this, fig, props);
    };

        LineHighlightPlugin.prototype.draw = function(){
          for(var i=0; i<this.props.line_ids.length; i++){
         var obj = mpld3.get_element(this.props.line_ids[i], this.fig),
             alpha_fg = this.props.alpha_fg;
             alpha_bg = this.props.alpha_bg;
         obj.elements()
             .on("mouseover", function(d, i){
                            d3.select(this).transition().duration(50)
                              .style("stroke-opacity", alpha_fg); })
             .on("mouseout", function(d, i){
                            d3.select(this).transition().duration(200)
                              .style("stroke-opacity", alpha_bg); });
      }
    };
    """

    def __init__(self, lines):
        self.lines = lines
        self.dict_ = {"type": "linehighlight",
                      "line_ids": [utils.get_id(line) for line in lines],
                      "alpha_bg": lines[0].get_alpha(),
                      "alpha_fg": 1.0}

df = pd.DataFrame([['XYZ','2010-12-01',78],
    ['XYZ','2011-12-01',89],
    ['XYZ','2012-12-01',89],
    ['ABC','2010-02-01',60],
    ['ABC','2011-02-01',59],
    ['ABC','2012-02-01',70],
    ['DEF','2010-02-01',25],
    ['DEF','2011-02-01',40],
    ['DEF','2012-02-01',55]],columns=['name','date','score'])
df= df.head(10)

df['year'] = pd.DatetimeIndex(df['date']).year
df.set_index('date', inplace=True)
df.groupby('name')['score'].plot()

x = df['year'].values
y = df['score'].values
fig, ax = plt.subplots(subplot_kw={'xticks': [], 'yticks': []})
lines = ax.plot(x, y.T, color='grey', lw=4, alpha=0.1)
plugins.connect(fig, HighlightLines(lines))
mpld3.display()
...