【问题标题】:How to zoom with d3如何使用 d3 进行缩放
【发布时间】:2015-09-05 01:24:20
【问题描述】:

我正在用 d3 绘制一个简单的条形图,我有一个 x 轴设置和画笔设置,这样我就可以刷“选择”一组条形图。然后我想向下钻取并缩放图表以仅包含这些条形图。以下代码有效,内部和被画笔触摸的条形颜色变为正确的颜色,但我无法使事物缩放。

我看过这个:http://bl.ocks.org/mbostock/1667367 和一堆其他的东西,只是想不通。

Here is a fiddle, can someone show me how to simply zoom the darn thing?

var brush;

function go3()
{
    var dataset = [];
    var m = 40;
    var count = 500;
    dataset.push(m);
    for (var i = 0; i < 150; i++) {           //Loop 25 times
        var newNumber = Math.random() * m;  //New random number (0-30)
        dataset.push(newNumber);             //Add new number to array
    }

    margin = {top: 10, right: 10, bottom: 30, left: 10},
    width = 960 - margin.left - margin.right,
    height = 500 - margin.top - margin.bottom


    w = width;
    h = height;

    yScale = d3.scale.linear().domain([0, d3.max(dataset)]).range([0, h * .95]);
    xScale = d3.scale.linear()
        .range([0, w])
        .domain([0, w]);
    var xAxis = d3.svg.axis().scale(xScale).orient("bottom");

    console.log("Max: " + d3.max(dataset));

    svg = d3.select("body")
        .append("svg")
        .attr("width", w  + margin.left + margin.right)
        .attr("height", h + margin.top + margin.bottom)
    ;

    svg.append("rect")
        .attr("stroke", "grey")
        .attr("stroke-width", 1)
        .attr("width", w + margin.left + margin.right)
        .attr("height", h + margin.top + margin.bottom)
        .attr("fill", "#FFFFFF")
        .classed("main-container", true);

    svg.append("rect")
        .attr("width", w)
        .attr("height", h)
        .attr("stroke", "grey")
        .attr("stroke-width", 0)
        .attr("fill", "#EEFFEE")
        .attr("x", margin.left)
        .attr("y", margin.top)
        .classed("brushable-container", true)
    ;

    xAxisGroup = svg.append("g")
        .attr("transform", "translate(" + margin.left + "," + (h + margin.top) + ")")
        .call(xAxis)

    padding=2;

    rects = svg.append("g").selectAll(".brushable")
        .data(dataset)
        .enter()
        .append("rect")
        .classed("brushable", true);


    brush = d3.svg.brush()
        .x(xScale)
        .on("brush", brushmove)
        .on("brushend", brushend);

    context = svg.append("g")
        .attr("class", "context")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
        .attr("class", "brush")
        .call(brush)
        .selectAll('rect')
        .attr('height', h);

    barWidth = w / dataset.length;
    console.log("Width: " + barWidth);
    rects
        .attr("width", 4)
        .attr("height", function(d, i){ return yScale(d)})
        .attr("stroke", "yellow")
        .attr("stroke-width", .3)
        .attr("x", function(d, i){ return (i * barWidth + margin.left) })
        .attr("y", function(d, i){ return h - yScale(d) + margin.top} )
    ;
}

function brushend(){
    var extent = brush.extent();
    var min = extent[0] >= extent[1] ? extent[1] : extent[0];
    var max = extent[0] >= extent[1] ? extent[0] : extent[1];

    var lolobb = d3.selectAll("rect.brushable");
    var lob = lolobb[0];
    console.log(min + " - " + max);
    var i = 0;
    while( i <  lob.length ){
        var bbb = lob[i];
        try {
            var p = parseFloat(bbb.attributes.x.value);
            if(min <= p && max >= p) {
                d3.select(bbb).attr("fill", "#00FF00");
            } else {
                d3.select(bbb).attr("fill", "#000000");
            }
            i++;
        } catch(r) {
            console.log("BBB");
            console.log(bbb);
            console.log("Error with " + i);
            console.log(typeof(bbb));
            console.log(r);
        }
    }
    console.log(min + " - " + max);
    console.log(lolobb);
}

function brushmove() {
    var extent = brush.extent();
}

【问题讨论】:

标签: javascript d3.js


【解决方案1】:

您可以通过在"body" 上添加调用zoom 函数来做到这一点,您可以这样做:

svg = d3.select("body")
    .append("svg")
    .attr("width", w  + margin.left + margin.right)
    .attr("height", h + margin.top + margin.bottom)
    .append("g")
    .call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom))
;

缩放部分为:

    .append("g")
    .call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom))

然后添加zoom()函数:

function zoom() {
  svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}

Here is a Fiddle Example。使用滚轮进行缩放。

【讨论】:

  • 我明白了,我真正想要的是在有人刷完后放大。当您查看小提琴时,您可以看到“选定”矩形改变了颜色(通过样式更改)。我也希望它放大。不带滚轮
  • @mikeb 缩放时滚轮是默认的,你有什么不想使用它的原因吗?图表中心的基本缩放是否有效?还是您想根据所选区域进行缩放?
  • 是的,原因是我设置了它,以便您可以选择条形图的一部分,我想放大到该部分。它可能是图表最底部的 10%,也可能是顶部的 80%,或者可能是中间的 2%。我有“画笔”设置来“选择”要缩放的部分,我想放大到它。
  • @mikeb 看来您可能想做一些比缩放更复杂的事情。缩放到它只是缩放到该选择的中心。还是让选择变得“更大”而其他东西“更小”?另外,你会如何恢复正常?
  • 好的,我有一个 1->500 的 x 轴和一堆垂直条。用户用“画笔”选择一个区域,选择从 x 轴上的点 100 开始,到点 200 结束。我想要做的是在放大时只显示 100 到 200 之间的条形。我不知道还能怎么称呼它,因为它对我来说似乎是“缩放”。
猜你喜欢
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2013-10-05
相关资源
最近更新 更多