问题描述
我有一个表,该表包含id,值列和使用mpld3的相应[random walk plot] [1]。我想从线条图中预先突出显示特定的线条,而不是鼠标悬停。
mpld3的代码段:[1]:https://mpld3.github.io/examples/random_walk.html
import jinja2
import json
import numpy as np
import matplotlib.pyplot as plt
import mpld3
from mpld3 import plugins,utils
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",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}
N_paths = 50
N_steps = 100
x = np.linspace(0,10,100)
y = 0.1 * (np.random.random((N_paths,N_steps)) - 0.5)
y = y.cumsum(1)
fig,ax = plt.subplots(subplot_kw={'xticks': [],'yticks': []})
lines = ax.plot(x,y.T,color='blue',lw=4,alpha=0.1)
plugins.connect(fig,HighlightLines(lines))
mpld3.show()
结合@codemax的建议后的代码
import jinja2
import json
import numpy as np
import matplotlib.pyplot as plt
import mpld3
from mpld3 import plugins,props);
};
LineHighlightPlugin.prototype.draw = function(){
for(var i=0; i<this.props.line_ids.length; i++){
const list = [0,4,6];
if (list.includes(i)) {
obj.elements().style("stroke-opacity",alpha_fg);
}
}
};
"""
def __init__(self,HighlightLines(lines))
mpld3.show()
解决方法
您可以选择单个行并使用此方法突出显示它。
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;
// Depending on which line you wish to highlight,// you can change 1 to any index
// add the following 3 lines to your code
if (i === 1) {
obj.elements().style("stroke-opacity",alpha_fg);
}
obj.elements()
.on("mouseover",function(d,i){
d3.select(this).transition().duration(50)
.style("stroke-opacity",alpha_fg); })
.on("mouseout",i){
d3.select(this).transition().duration(200)
.style("stroke-opacity",alpha_bg); });
}
};
如果要突出显示多行,可以使用这种方法。
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],alpha_fg = this.props.alpha_fg;
alpha_bg = this.props.alpha_bg;
// add the following 4 lines to your code
const list = [0,4,6]; // these numbers are random. Use your own numbers
if (list.includes(i)) {
obj.elements().style("stroke-opacity",alpha_fg);
}
obj.elements()
.on("mouseover",alpha_bg); });
}
};