Я пытаюсь расширить пример при условии here:MPLD3: информация этикетка barplot
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))
Моя цель состоит в том, чтобы сделать то же самое (отображение метки, когда объект будет нажата), но с barplot вместо рассеивания ,
Он не работает с тем же кодом 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.
Спасибо! Я понимаю часть python, но остаюсь озадаченным 'this.props.ids.forEach (function (id, i) {'. Ответ является идеальным, хотя! – hhh
Вот более питонная версия такого рода функционального программирования: 'map (lambda id: (...), [id1, id2, id3]) ' –