缩放仅适用于一个元素(Zoom only works on one element)

系统教程 行业动态 更新时间:2024-06-14 16:57:18
缩放仅适用于一个元素(Zoom only works on one element)

我使用d3.nest()创建了一个包含多个区域图的图形,这些图由另一个函数着色。 当我尝试添加此缩放功能时,我只能使用第一个区域图。

这是一个普拉克

<!DOCTYPE html> <meta charset="utf-8"> <style> svg { font: 10px sans-serif; } .area { fill: steelblue; clip-path: url(#clip); } .axis path, .axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } .brush .extent { stroke: #fff; fill-opacity: .125; shape-rendering: crispEdges; } </style> <body> <script src="http://d3js.org/d3.v3.min.js"></script> <script> var margin = {top: 10, right: 10, bottom: 100, left: 40}, margin2 = {top: 430, right: 10, bottom: 20, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom, height2 = 500 - margin2.top - margin2.bottom; var x = d3.scale.linear().range([0, width]), x2 = d3.scale.linear().range([0, width]), y = d3.scale.linear().range([height, 0]), y2 = d3.scale.linear().range([height2, 0]); var xAxis = d3.svg.axis().scale(x).orient("bottom"), xAxis2 = d3.svg.axis().scale(x2).orient("bottom"), yAxis = d3.svg.axis().scale(y).orient("left"); var brush = d3.svg.brush() .x(x2) .on("brush", brushed); var area = d3.svg.area() .interpolate("basis") .x(function(d) { return x(d.distance); }) .y0(height) .y1(function(d) { return y(d.elevation); }); var area2 = d3.svg.area() .interpolate("basis") .x(function(d) { return x2(d.distance); }) .y0(height2) .y1(function(d) { return y2(d.elevation); }); // Map colors to limits var color = d3.scale.ordinal() .domain([-10,-5,0,5,10]) .range(['#a1d99b','#c7e9c0','#fdd0a2','#fdae6b','#fd8d3c','#e6550d']); var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom); svg.append("defs").append("clipPath") .attr("id", "clip") .append("rect") .attr("width", width) .attr("height", height); var focus = svg.append("g") .attr("class", "focus") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var context = svg.append("g") .attr("class", "context") .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")"); // Caculate the average gradient of a dataGroup. function dataGroupGradient(dataGroup) { return d3.mean(dataGroup, function(value) { return parseFloat(value.gradient); }); } var line_points = []; d3.csv("first5km_Strade_Bianche.csv", function(error, data) { data.forEach(function(d) { d.distance = +d.distance; d.elevation = +d.elevation; d.latitude = +d.latitude; d.longitude = +d.longitude; line_points.push([d.latitude, d.longitude]); }); // Split the data based on "group" var dataGroup = d3.nest() .key(function(d) { return d.group; }) .entries(data); // To remove white space between dataGroups, append the first element of one // dataGroup to the last element of the previous dataGroup. dataGroup.forEach(function(group, i) { if(i < dataGroup.length - 1) { group.values.push(dataGroup[i+1].values[0]) } }) x.domain(d3.extent(data.map(function(d) { return d.distance; }))); y.domain([0, d3.max(data.map(function(d) { return d.elevation; }))]); x2.domain(x.domain()); y2.domain(y.domain()); // Add a line and an area for each dataGroup dataGroup.forEach(function(d, i){ focus.append("path") .datum(d.values) .attr("class", "area") .attr("d", area); }); focus.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); focus.append("g") .attr("class", "y axis") .call(yAxis); context.append("path") .datum(data) .attr("class", "area") .attr("d", area2); dataGroup.forEach(function(d, i){ context.append("path") .datum(d.values) .attr("class", "area") .attr("d", area2); }); // Fill the dataGroups with color svg.selectAll(".area") .style("fill", function(d) { return color(dataGroupGradient(d)); }); context.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height2 + ")") .call(xAxis2); context.append("g") .attr("class", "x brush") .call(brush) .selectAll("rect") .attr("y", -6) .attr("height", height2 + 7); }); function brushed() { x.domain(brush.empty() ? x2.domain() : brush.extent()); focus.select(".area").attr("d", area); focus.select(".x.axis").call(xAxis); } function type(d) { d.distance = parseDate(d.distance); d.elevation = +d.elevation; return d; } </script>

I've created a graph with multiple area plots using d3.nest() that are colored by another function. When I attempted to add this zoom functionality, I'm only getting it to work with the first area plot.

Here's a Plunk

<!DOCTYPE html> <meta charset="utf-8"> <style> svg { font: 10px sans-serif; } .area { fill: steelblue; clip-path: url(#clip); } .axis path, .axis line { fill: none; stroke: #000; shape-rendering: crispEdges; } .brush .extent { stroke: #fff; fill-opacity: .125; shape-rendering: crispEdges; } </style> <body> <script src="http://d3js.org/d3.v3.min.js"></script> <script> var margin = {top: 10, right: 10, bottom: 100, left: 40}, margin2 = {top: 430, right: 10, bottom: 20, left: 40}, width = 960 - margin.left - margin.right, height = 500 - margin.top - margin.bottom, height2 = 500 - margin2.top - margin2.bottom; var x = d3.scale.linear().range([0, width]), x2 = d3.scale.linear().range([0, width]), y = d3.scale.linear().range([height, 0]), y2 = d3.scale.linear().range([height2, 0]); var xAxis = d3.svg.axis().scale(x).orient("bottom"), xAxis2 = d3.svg.axis().scale(x2).orient("bottom"), yAxis = d3.svg.axis().scale(y).orient("left"); var brush = d3.svg.brush() .x(x2) .on("brush", brushed); var area = d3.svg.area() .interpolate("basis") .x(function(d) { return x(d.distance); }) .y0(height) .y1(function(d) { return y(d.elevation); }); var area2 = d3.svg.area() .interpolate("basis") .x(function(d) { return x2(d.distance); }) .y0(height2) .y1(function(d) { return y2(d.elevation); }); // Map colors to limits var color = d3.scale.ordinal() .domain([-10,-5,0,5,10]) .range(['#a1d99b','#c7e9c0','#fdd0a2','#fdae6b','#fd8d3c','#e6550d']); var svg = d3.select("body").append("svg") .attr("width", width + margin.left + margin.right) .attr("height", height + margin.top + margin.bottom); svg.append("defs").append("clipPath") .attr("id", "clip") .append("rect") .attr("width", width) .attr("height", height); var focus = svg.append("g") .attr("class", "focus") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var context = svg.append("g") .attr("class", "context") .attr("transform", "translate(" + margin2.left + "," + margin2.top + ")"); // Caculate the average gradient of a dataGroup. function dataGroupGradient(dataGroup) { return d3.mean(dataGroup, function(value) { return parseFloat(value.gradient); }); } var line_points = []; d3.csv("first5km_Strade_Bianche.csv", function(error, data) { data.forEach(function(d) { d.distance = +d.distance; d.elevation = +d.elevation; d.latitude = +d.latitude; d.longitude = +d.longitude; line_points.push([d.latitude, d.longitude]); }); // Split the data based on "group" var dataGroup = d3.nest() .key(function(d) { return d.group; }) .entries(data); // To remove white space between dataGroups, append the first element of one // dataGroup to the last element of the previous dataGroup. dataGroup.forEach(function(group, i) { if(i < dataGroup.length - 1) { group.values.push(dataGroup[i+1].values[0]) } }) x.domain(d3.extent(data.map(function(d) { return d.distance; }))); y.domain([0, d3.max(data.map(function(d) { return d.elevation; }))]); x2.domain(x.domain()); y2.domain(y.domain()); // Add a line and an area for each dataGroup dataGroup.forEach(function(d, i){ focus.append("path") .datum(d.values) .attr("class", "area") .attr("d", area); }); focus.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height + ")") .call(xAxis); focus.append("g") .attr("class", "y axis") .call(yAxis); context.append("path") .datum(data) .attr("class", "area") .attr("d", area2); dataGroup.forEach(function(d, i){ context.append("path") .datum(d.values) .attr("class", "area") .attr("d", area2); }); // Fill the dataGroups with color svg.selectAll(".area") .style("fill", function(d) { return color(dataGroupGradient(d)); }); context.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + height2 + ")") .call(xAxis2); context.append("g") .attr("class", "x brush") .call(brush) .selectAll("rect") .attr("y", -6) .attr("height", height2 + 7); }); function brushed() { x.domain(brush.empty() ? x2.domain() : brush.extent()); focus.select(".area").attr("d", area); focus.select(".x.axis").call(xAxis); } function type(d) { d.distance = parseDate(d.distance); d.elevation = +d.elevation; return d; } </script>

最满意答案

刷子处理程序中只是一个小错误:

function brushed() { x.domain(brush.empty() ? x2.domain() : brush.extent()); focus.select(".area").attr("d", area);// <-- HERE! focus.select(".x.axis").call(xAxis); }

对focus.select(".area")的调用仅选择单个路径。 你想要所有的路径。 所以,请使用selectAll() :

focus.selectAll(".area").attr("d", area);

更新了Plunk

Just a small mistake inside the brush handler:

function brushed() { x.domain(brush.empty() ? x2.domain() : brush.extent()); focus.select(".area").attr("d", area);// <-- HERE! focus.select(".x.axis").call(xAxis); }

The call to focus.select(".area") only selects a single path. You want all paths. So, instead, use selectAll():

focus.selectAll(".area").attr("d", area);

Updated Plunk

更多推荐

本文发布于:2023-04-12 20:36:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/e4b0ac0b29bb0aa1bede47f9e5ddef87.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:适用于   缩放   元素   element   works

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!