我正在尝试扩展此处提供的示例:
from mpld3 import utils
class ClickInfo(plugins.PluginBase):
"""Plugin for getting info on click"""
JAVASCRIPT = """
mpld3.register_plugin("clickinfo", ClickInfo);
ClickInfo.prototype = Object.create(mpld3.Plugin.prototype);
ClickInfo.prototype.constructor = ClickInfo;
ClickInfo.prototype.requiredProps = ["id"];
function ClickInfo(fig, props){
mpld3.Plugin.call(this, fig, props);
};
ClickInfo.prototype.draw = function(){
var obj = mpld3.get_element(this.props.id);
obj.elements().on("mousedown",
function(d, i){alert("clicked on points[" + i + "]");});
}
"""
def __init__(self, points):
self.dict_ = {"type": "clickinfo",
"id": utils.get_id(points)}
fig, ax = plt.subplots()
points = ax.scatter(np.random.rand(50), np.random.rand(50),
s=500, alpha=0.3)
plugins.connect(fig, ClickInfo(points))
我的目的是做同样的事情(单击对象时显示标签),但使用条形图而不是散点图。
它不适用于相同的 Javascript 代码:
from mpld3 import utils
class ClickInfo(plugins.PluginBase):
"""Plugin for getting info on click"""
JAVASCRIPT = """
mpld3.register_plugin("clickinfo", ClickInfo);
ClickInfo.prototype = Object.create(mpld3.Plugin.prototype);
ClickInfo.prototype.constructor = ClickInfo;
ClickInfo.prototype.requiredProps = ["id"];
function ClickInfo(fig, props){
mpld3.Plugin.call(this, fig, props);
};
ClickInfo.prototype.draw = function(){
var obj = mpld3.get_element(this.props.id);
obj.elements().on("mousedown",
function(d, i){alert("clicked on bar[" + i + "]");});
}
"""
def __init__(self, bars):
self.dict_ = {"type": "clickinfo",
"id": utils.get_id(bars)}
x = range(0,10)
y = np.random.rand(10)
fig, ax = plt.subplots()
bars = ax.bar(x, y)
plugins.connect(fig, ClickInfo(bars))
但是,我可以获得其中一个酒吧的工作行为。例如,使用plugins.connect(fig, ClickInfo(bars[0]))
,单击第一个栏将触发警报 Javascript 代码。
问题:
我怎样才能对每个栏有相同的行为?
此外,由于我对 D3 和 Javascript 缺乏经验,因此对代码如何工作的简短解释将非常有帮助。也欢迎任何学习资源,因为我找不到 MPLD3 教程。