javascript - 放大/缩小时保持 map 上 D3 对象大小不变

标签 javascript d3.js topojson

我正在遵循 http://bl.ocks.org/d3noob/raw/5193723/ 中的示例

示例中绘制的圆圈在放大时会增大。我无法找出保持圆圈大小相同的方法。

有什么想法吗?

编辑1:有关如何保持饼图弧半径恒定的任何想法。我已经找到了保持圆半径恒定的方法,如下所示:

            g1.append("circle")
                .attr("cx", 200)
                .attr("cy", 200)
                .attr("r", 10)
                .style("fill", "red");

        var zoom = d3.behavior.zoom().on("zoom", function () {

                g1.selectAll("circle")
                    .attr("transform", "translate(" + d3.event.translate.join(",") + ")scale(" + d3.event.scale + ")")
                    .attr("r", function(d) {
                        return 10/d3.event.scale;
                    });
            });

类似地,我有饼图的弧线,我希望在缩放时保持其大小:

                    var r = 4;
                    var p = Math.PI * 2;

                    var arc = d3.svg.arc()
                        .innerRadius(r - 2)
                        .outerRadius(r - 1)
                        .startAngle(0)
                        .endAngle(p * d.value1);
                    var arc2 = d3.svg.arc()
                        .innerRadius(r - 3)
                        .outerRadius(r - 2)
                        .startAngle(0)
                        .endAngle(p * d.value2);

                   var projection = d3.geo.mercator()
                        .center([0, 5])
                        .scale(200)

                    var translate = "translate(" + projection([77, 13])[0] + ", " + projection([77, 13])[1] + ")";
                    g.append("path")
                        .attr("d", arc)
                        .attr("fill", "maroon")
                        .attr("transform", translate);
                    g.append("path")
                        .attr("d", arc2)
                        .attr("fill", "green")
                        .attr("transform", translate);

关于如何保持弧形路径保持相同大小有什么建议吗?

最佳答案

您必须在缩放事件处理程序中添加一些额外的处理。将圆的半径设置为其标称值 (5) 除以缩放系数 (zoom.scale())。这样,当应用缩放比例时,结果将是恒定的外观尺寸。像这样的东西:

var zoom = d3.behavior.zoom()
    .on("zoom",function() {
        g.attr("transform","translate("+ 
            d3.event.translate.join(",")+")scale("+d3.event.scale+")");
        g.selectAll("circle")
            .attr("d", path.projection(projection))
            .attr("r", 5/zoom.scale());
        g.selectAll("path")  
            .attr("d", path.projection(projection)); 
    });

关于javascript - 放大/缩小时保持 map 上 D3 对象大小不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27460534/

相关文章:

javascript - 如何将一个数组中的首字母与另一个数组中的值匹配?

javascript - Canvas 未从 uri 绘制完整图像

javascript - 如何更新 Lollipop 图表的填充和排序值?

javascript - 使用 D3.js 只渲染 topojson map 的一部分

r - R/Leaflet 中的 TopoJSON choropleth?

javascript - Javascript 中是否需要类?它们对创建对象有什么影响?

javascript - @babel/plugin-proposal-optional-chaining 在 Vue.js <script> 标签中不起作用

javascript - 如何使用 dc.js 创建单行堆叠行图表?

reactjs - 将事件处理程序附加到 nvd3 图表的标签

d3.js - 带有 topojson 的脆边?