简体   繁体   English

D3放大图形

[英]D3 Zooming in graph

i have tried using D3.zoom behavior in my scatterplot graph. 我曾尝试在散点图中使用D3.zoom行为。

But the problem i am having now is that, i can only zoom my graph ONLY when i mouseover my DOT. 但是我现在遇到的问题是,只有当我将鼠标悬停在DOT上时,我才能缩放图形。 Any reasons why? 有什么原因吗? I want it to be able to zoom in anywhere as long as my mouse is pointing inside the graph. 我希望它能够在任何地方放大,只要我的鼠标指向图形内即可。 And also, my X axis doesn't stays at the bottom... it gets zoomed in as well Is it possible to just let the X Axis stay constant at the bottom? 而且,我的X轴不停留在底部...它也被放大了是否可以让X轴在底部保持恒定?

here are my codes... 这是我的代码...

var margin = {top: 30, right: 20, bottom: 30, left: 50},    
width = 650 - margin.left - margin.right,               
height = 400 - margin.top - margin.bottom;              


var parseDate = d3.time.format("%Y-%m-%dT%H:%M:%S").parse;  


var x = d3.time.scale().range([0, width]);  
var y = d3.scale.linear().range([height, 0]);           


var zoom = d3.behavior.zoom()
.scaleExtent([0.95, 10])
.on("zoom", zoomed);

var drag = d3.behavior.drag()
.origin(function(d) { return d; })
.on("dragstart", dragstarted)
.on("drag", dragged)
.on("dragend", dragended);


var xAxis = d3.svg.axis().scale(x)                          
.orient("bottom").ticks(5);                             


var valueline = d3.svg.line()                               
.x(function(d) { return x(d.ArtDateTime); })                
.y(function(d) { return y(d.Ranking); });                   


var svg = d3.select(".graph")
.append("svg")                                          
.attr("width", width + margin.left + margin.right)  
.attr("height", height + margin.top + margin.bottom)
.append("g")                                            
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.call(zoom);


function zoomed() {
svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
svg.selectAll("g")
    .attr("width", width)
    .attr("height", height);
}



function make_x_axis() {
return d3.svg.axis()
.scale(x)
.orient("bottom")
.ticks(4)
}


function make_y_axis() {
return d3.svg.axis()
    .scale(y)
    .orient("left")
    .ticks(4)
}


function dragstarted(d) {
  d3.event.sourceEvent.stopPropagation();
  d3.select(this).classed("dragging", true);
}


function dragged(d) {
  d3.select(this).attr("cx", d.x = d3.event.x).attr("cy", d.y = d3.event.y);
}


function dragended(d) {
  d3.select(this).classed("dragging", false);
}


d3.csv("FinalCSVFile.csv", function(error, data) {              
data.forEach(function(d) {                              
    d.ArtDateTime = parseDate(d.ArtDateTime);                           
    d.Ranking = +d.Ranking;                                 
});


x.domain(d3.extent(data, function(d) { return d.ArtDateTime; }));   
y.domain([0, d3.max(data, function(d) { return d.Ranking; })]); 

// Add the X Axis
svg.append("g") 
    .transition()   
    .duration(300)                                  
    .attr("class", "x axis")                            
    .attr("transform", "translate(0," + height + ")")   
    .call(xAxis);                                       

svg.append('g')
    .transition()
    .duration(300)
    .attr('class', 'grid')
    .attr('transform', 'translate(0,' + height + ")")
    .call(make_x_axis()
        .tickSize(-height, 0, 0)
        .tickFormat("")
        )

svg.append('g')
    .transition()
    .duration(300)
    .attr("class", "grid")
    .call(make_y_axis()
        .tickSize(-width, 0, 0)
        .tickFormat("")
        )

svg.selectAll(".dot")
    .data(data)
    .enter().append("circle")
    .attr("class", "dot")
    .attr("r", 5)
    .attr("cx", function(d) { return x(d.ArtDateTime);})
    .attr("cy", function(d) { return y(d.Ranking * 3); })
    .on("mouseover", function(d) {
        var xPosition = parseFloat(d3.select(this).attr("cx"));
        var yPosition = parseFloat(d3.select(this).attr("cy"));
        d3.select(this)
            .transition()
            .duration(20)
        .style("fill", "red");

    d3.select("#box")
        .transition()
        .duration(300)
        .style("left", xPosition + 80 + "px")
        .style("top", yPosition + 140 +"px" )
        .select("#ranking")
        .text(d.Ranking)

    d3.select("#box")
        .select("#startDT")
        .text(d.startDateTime)

    d3.select("#box")
        .select("#senCONT")
        .text(d.sentenceContent)

    d3.select("#tooltip")
        .classed("hidden", false);

    })
        .on("mouseout", function() {
    d3.select("#tooltip")
    .classed("hidden", true);
    });
});

The reason you can't zoom in on the white areas is because there is actually nothing there to zoom in on. 无法放大白色区域的原因是,实际上没有可放大的区域。 Paste this code below into your jsfiddle example at line 39 (after you've created the svg variable) to append a background rectangle behind your graph that you can zoom in on. 将下面的代码粘贴到第39行的jsfiddle示例中(创建svg变量之后),以便在图形后面附加一个可以放大的背景矩形。

      svg.append("rect")
         .attr("width", width)
         .attr("height", height)
         .style("fill", "#fff");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM