Показать данные о наведении курсора мыши на круг
У меня есть набор данных, которые я строю в разброс. Когда я наведу курсор мыши на один из кругов, я хотел бы, чтобы он всплывал с данными (например, значения x, y, может быть, больше). Вот что я пытался использовать:
vis.selectAll("circle")
.data(datafiltered).enter().append("svg:circle")
.attr("cx", function(d) { return x(d.x);})
.attr("cy", function(d) {return y(d.y)})
.attr("fill", "red").attr("r", 15)
.on("mouseover", function() {
d3.select(this).enter().append("text")
.text(function(d) {return d.x;})
.attr("x", function(d) {return x(d.x);})
.attr("y", function (d) {return y(d.y);}); });
Я подозреваю, что мне нужно быть более информативным о том, какие данные вводить?
5 ответов:
Я предполагаю, что то, что вы хотите-это подсказка. Самый простой способ сделать это-добавить
svg:titleэлемент для каждого круга, так как браузер будет заботиться о показе всплывающей подсказки, и вам не нужен манипулятор мыши. Код будет что-то вродеvis.selectAll("circle") .data(datafiltered).enter().append("svg:circle") ... .append("svg:title") .text(function(d) { return d.x; });Если вы хотите более причудливые подсказки, вы можете использовать tipsy, например. Смотрите здесь для примера.
действительно хороший способ сделать подсказку описан здесь:простой пример подсказки D3
вы должны добавить div
var tooltip = d3.select("body") .append("div") .style("position", "absolute") .style("z-index", "10") .style("visibility", "hidden") .text("a simple tooltip");затем вы можете просто переключить его с помощью
.on("mouseover", function(){return tooltip.style("visibility", "visible");}) .on("mousemove", function(){return tooltip.style("top", (d3.event.pageY-10)+"px").style("left",(d3.event.pageX+10)+"px");}) .on("mouseout", function(){return tooltip.style("visibility", "hidden");});
d3.event.pageX/d3.event.pageY- текущая координата мыши.если вы хотите изменить текст, вы можете использовать
tooltip.text("my tooltip text");
есть удивительная библиотека для этого, что я недавно обнаружил. Он прост в использовании, и результат довольно аккуратный: D3-tip.
вы можете увидеть пример здесь:
в принципе, все, что вам нужно сделать, это загрузить(.js), включают в себя скрипт:
<script src="index.js"></script>а затем следуйте инструкциям от здесь (та же ссылка, что и пример)
но для вашего кода, это было бы что-то вроде:
определить способ:
var tip = d3.tip() .attr('class', 'd3-tip') .offset([-10, 0]) .html(function(d) { return "<strong>Frequency:</strong> <span style='color:red'>" + d.frequency + "</span>"; })создайте свой svg (как вы уже делаете)
var svg = ...вызов метода:
svg.call(tip);добавить подсказку к объекту:
vis.selectAll("circle") .data(datafiltered).enter().append("svg:circle") ... .on('mouseover', tip.show) .on('mouseout', tip.hide)не забудьте добавить CSS:
<style> .d3-tip { line-height: 1; font-weight: bold; padding: 12px; background: rgba(0, 0, 0, 0.8); color: #fff; border-radius: 2px; } /* Creates a small triangle extender for the tooltip */ .d3-tip:after { box-sizing: border-box; display: inline; font-size: 10px; width: 100%; line-height: 1; color: rgba(0, 0, 0, 0.8); content: "BC"; position: absolute; text-align: center; } /* Style northward tooltips differently */ .d3-tip.n:after { margin: -1px 0 0 0; top: 100%; left: 0; } </style>
вы можете передать данные, которые будут использоваться в наведении мыши, как это - событие наведения мыши использует функцию с ранее
entered данные в качестве аргумента (и индекс в качестве второго аргумента), так что вам не нужно использоватьenter()второй раз.vis.selectAll("circle") .data(datafiltered).enter().append("svg:circle") .attr("cx", function(d) { return x(d.x);}) .attr("cy", function(d) {return y(d.y)}) .attr("fill", "red").attr("r", 15) .on("mouseover", function(d,i) { d3.select(this).append("text") .text( d.x) .attr("x", x(d.x)) .attr("y", y(d.y)); });
этот краткий пример демонстрирует общий способ создания пользовательской подсказки в d3.
var w = 500; var h = 150; var dataset = [5, 10, 15, 20, 25]; // firstly we create div element that we can use as // tooltip container, it have absolute position and // visibility: hidden by default var tooltip = d3.select("body") .append("div") .attr('class', 'tooltip'); var svg = d3.select("body") .append("svg") .attr("width", w) .attr("height", h); // here we add some circles on the page var circles = svg.selectAll("circle") .data(dataset) .enter() .append("circle"); circles.attr("cx", function(d, i) { return (i * 50) + 25; }) .attr("cy", h / 2) .attr("r", function(d) { return d; }) // we define "mouseover" handler, here we change tooltip // visibility to "visible" and add appropriate test .on("mouseover", function(d) { return tooltip.style("visibility", "visible").text('radius = ' + d); }) // we move tooltip during of "mousemove" .on("mousemove", function() { return tooltip.style("top", (event.pageY - 30) + "px") .style("left", event.pageX + "px"); }) // we hide our tooltip on "mouseout" .on("mouseout", function() { return tooltip.style("visibility", "hidden"); });.tooltip { position: absolute; z-index: 10; visibility: hidden; background-color: lightblue; text-align: center; padding: 4px; border-radius: 4px; font-weight: bold; color: orange; }<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.11.0/d3.min.js"></script>

Comments