d3 Choropleth карта с эффектом наведения не отображает всплывающую подсказку - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь добавить всплывающую подсказку к карте Choropleth d3 с эффектом наведения на этой странице https://www.d3 -graph-gallery.com / graph / choropleth_hover_effect.html d3 Chroropleth map Похоже, что всплывающая подсказка добавляется к svg, так как я могу осмотреть карту и увидеть внутренний div с предполагаемым текстом, который должен отображаться при наведении курсора на страны, но при этом ничего не отображается, хотя параметры всплывающей подсказки кажутсяобновляться при каждом наведении.

Я взял подсказку из другого графика, так как текущая карта, которую я пытаюсь реализовать, не имеет подсказки. Я попытался создать переменную всплывающей подсказки в функции ready (error, topo) и стилях / данных в функциях mouseover и mouseleave, но она не отображает всплывающую подсказку для стран

Вот код в моем xhtml

<head>
        <!-- Load d3.js and the geo projection plugin -->
        <script src="https://d3js.org/d3.v4.js"></script>
        <script src="https://d3js.org/d3-scale-chromatic.v1.min.js"></script>
        <script src="https://d3js.org/d3-geo-projection.v2.min.js"></script>

        <script>
            jQuery(document).ready(function() {
                // The svg
                var svg = d3.select("svg"),
                width = +svg.attr("width"),
                height = +svg.attr("height");

                // Map and projection
                var path = d3.geoPath();
                var projection = d3.geoMercator()
                .scale(70)
                .center([0,20])
                .translate([width / 2, height / 2]);

                // Data and color scale
                var data = d3.map();
                var colorScale = d3.scaleThreshold()
                .domain([100000, 1000000, 10000000, 30000000, 100000000, 500000000])
                .range(d3.schemeBlues[7]);

                // Load external data and boot
                d3.queue()
                .defer(d3.json, "https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world.geojson")
                .defer(d3.csv, "https://raw.githubusercontent.com/holtzy/D3-graph-gallery/master/DATA/world_population.csv", function(d) { data.set(d.code, +d.pop); })
                .await(ready);

                var tooltip = d3.select("#my_dataviz")
                    .append("div")
                    .style("opacity", 0)
                    .attr("class", "tooltip")
                    .style("background-color", "white")
                    .style("border", "solid")
                    .style("border-width", "2px")
                    .style("border-radius", "5px")
                    .style("padding", "5px")

                function ready(error, topo) {

                    let mouseOver = function(d) {
                        d3.selectAll(".Country")
                        .transition()
                        .duration(200)
                        .style("opacity", .5)
                        d3.select(this)
                        .transition()
                        .duration(200)
                        .style("opacity", 1)
                        .style("stroke", "black")
                        tooltip.style("opacity", 1)
                            .html("The exact value of<br/>this cell is: " + d.pop)
                            .style("left", (d3.mouse(this)[0]+70) + "px")
                            .style("top", (d3.mouse(this)[1]) + "px")
                    }

                    let mouseLeave = function(d) {
                        d3.selectAll(".Country")
                        .transition()
                        .duration(200)
                        .style("opacity", .8)
                        d3.select(this)
                        .transition()
                        .duration(200)
                        .style("stroke", "transparent")
                        tooltip.style("opacity", 0)
                    }

                    // Draw the map
                    svg.append("g")
                        .selectAll("path")
                        .data(topo.features)
                        .enter()
                        .append("path")
                        // draw each country
                        .attr("d", d3.geoPath()
                            .projection(projection)
                        )
                        // set the color of each country
                        .attr("fill", function (d) {
                            d.total = data.get(d.id) || 0;
                            return colorScale(d.total);
                        })
                        .style("stroke", "transparent")
                        .attr("class", function(d){ return "Country" } )
                        .style("opacity", .8)
                        .on("mouseover", mouseOver )
                        .on("mouseleave", mouseLeave )
                }
            })
        </script>
    </head>

    <div>
        <div>
    <h1>Graphs</h1>

    <!-- Create an element where the map will take place -->
    <svg id="my_dataviz" width="400" height="300"></svg>

    </div>
    </div>

После рендеринга карты (работающей только с функцией зависания) я проверяю ее и вижу следующее.

Map hovering on Russia and showing data on tooltip div over console

Если я меняю страну, данные в div всплывающей подсказки меняются.

Map hovering on EEUU and showing different data on tooltip div over console

- ОБНОВЛЕНИЕ -

Следуя совету @enxaneta, я попытался вывести div вне svg. Результат - всплывающая подсказка в отдельном элементе div. На этот раз всплывающая подсказка появляется на странице, но отображается внизу карты, а не поверх нее, как бы я хотел ее видеть.

Tooltip outside svg

Я все еще выясняю, как реализовать foreignObject.

- ОБНОВЛЕНИЕ 2 -

Добавление абсолютной позиции подсказки для маркера div и размещения его относительно зависания мыши,Однако, несмотря на то, что он вертикально выровнен с выбранной страной, он находится вверху страницы.

<style>
    .tooltip{position:absolute;}
</style>

tooltip floating arround

tooltip floating arround 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...