滚动单击d3 js条形图上的条形

时间:2019-01-31 09:20:34

标签: javascript jquery html css d3.js

我正在尝试为具有x轴滚动的条形图实现点击功能。 当我单击滚动条时,图形x轴向右移动,滚动条消失。 这是我在Codepen上的完整代码:https://codepen.io/sampath-PerOxide/pen/QYdqyZ

            var data = [
            { label: "Company Average", value: "20" },
            { label: "Banking & Finance", value: "10" },
            { label: "Research & Development", value: "40" },
            { label: "Design & Innovaon", value: "20" },
            { label: "Sales & Marketing", value: "10" },
            { label: "Company Average1", value: "20" },
            { label: "Banking & Finance1", value: "10" },
            { label: "Research & Development1", value: "40" },
            { label: "Design & Innovaon1", value: "20" },
            { label: "Sales & Marketing1", value: "10" },
            { label: "Company Average2", value: "20" },
            { label: "Banking & Finance2", value: "10" },
            { label: "Research & Development2", value: "40" },
            { label: "Design & Innovaon2", value: "20" },
            { label: "Sales & Marketing2", value: "10" },
            { label: "Company Average3", value: "20" },
            { label: "Banking & Finance3", value: "10" },
            { label: "Research & Development3", value: "40" },
            { label: "Design & Innovaon3", value: "20" },
            { label: "Sales & Marketing3", value: "10" },
            { label: "Company Average4", value: "20" },
            { label: "Banking & Finance4", value: "10" },
            { label: "Research & Development4", value: "40" },
            { label: "Design & Innovaon4", value: "20" },
            { label: "Sales & Marketing4", value: "10" },
            { label: "Company Average5", value: "20" },
            { label: "Banking & Finance5", value: "10" },
            { label: "Research & Development5", value: "40" },
            { label: "Design & Innovaon5", value: "20" },
            { label: "Sales & Marketing5", value: "10" }
            ];

            var margin = { top: 20, right: 10, bottom: 20, left: 40 };
            var marginOverview = { top: 30, right: 10, bottom: 20, left: 40 };
            var selectorHeight = 40;
            var width = 1100 - margin.left - margin.right;
            var height = 400 - margin.top - margin.bottom - selectorHeight;
            var heightOverview = 80 - marginOverview.top - marginOverview.bottom;
            var MIN_BAR_WIDTH = 20;
            var MIN_BAR_PADDING = 5;
            var svg = d3
            .select("#atthbd")
            .append("svg")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom + selectorHeight);

            var diagram = svg
            .append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

            var maxLength = d3.max(
            data.map(function(d) {
            return d.label.length;
            })
            );
            var barWidth = maxLength * 7;
            var numBars = Math.round(width / barWidth);
            var isScrollDisplayed = barWidth * data.length > width;

            var xscale = d3.scale
            .ordinal()
            .domain(
            data.slice(0, numBars).map(function(d) {
            return d.label;
            })
            )
            .rangeBands([0, width], 0.7);

            var yscale = d3.scale
            .linear()
            .domain([0, 40])
            .range([height, 0]);

            var xAxis = d3.svg
            .axis()
            .scale(xscale)
            .orient("bottom");
            var yAxis = d3.svg
            .axis()
            .scale(yscale)
            .orient("left");
            var tip2 = d3
            .tip()
            .attr("class", "d3-tip")
            .offset([-10, 0])
            .html(function(d2) {
            return "<p class='sec-sub-head'>Avg No.of days:" + d2.value + "</p>";
            });
            svg.call(tip2);

            diagram
            .append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0, " + height + ")")
            .call(xAxis);

            diagram
            .append("g")
            .attr("class", "y axis")
            .call(yAxis)
            .append("text")
            .attr("transform", "rotate(-90)")
            .attr("y", 6)
            .attr("dy", ".71em")
            .style("text-anchor", "end")
            .text("Average No. of days");

            var bartext = diagram
            .append("g")
            .attr("class", "bar-texts")
            .selectAll(".bar-text")
            .data(data.slice(0, numBars));

            var barTextEnter = bartext
            .enter()
            .append("text")
            .attr("class", "bar-text")
            .attr("x", function(d) {
            return xscale(d.label)+20;
            })
            .attr("y", function(d) {
            return yscale(d.value) - 5;
            })
            .text(function(d) {
            return d.value;
            })
            .attr("text-anchor", "middle");

            var bars = diagram.append("g").attr("class", "bars");

            bars
            .selectAll("rect")
            .data(data.slice(0, numBars), function(d) {
            return d.label;
            })
            .enter()
            .append("rect")
            .attr("class", "bar")
            .attr("x", function(d) {
            return xscale(d.label);
            })
            .attr("y", function(d) {
            return yscale(d.value);
            })
            .attr("width", xscale.rangeBand())
            .attr("height", function(d) {
            return height - yscale(d.value);
            })
            .on("mouseover", tip2.show)
            .on("mouseout", tip2.hide);

            if (isScrollDisplayed) {
            var xOverview = d3.scale
            .ordinal()
            .domain(
            data.map(function(d) {
            return d.label;
            })
            )
            .rangeBands([0, width], 0.2);
            yOverview = d3.scale.linear().range([heightOverview, 0]);
            yOverview.domain(yscale.domain());
            var overviewGroup = diagram.append('g')
            .attr('width', width)
            .attr('height', heightOverview);

            var subBars = overviewGroup
            .append("g")
            .attr("class", "sub-bars")
            .selectAll(".subBar")
            .data(data);

            subBars
            .enter()
            .append("rect")
            .classed("subBar", true)
            .attr({
            height: function(d) {
            return heightOverview - yOverview(d.value);
            },
            width: function(d) {
            return xOverview.rangeBand();
            },
            x: function(d) {
            return xOverview(d.label);
            },
            y: function(d) {
            return height + heightOverview + yOverview(d.value);
            }
            });
            var overviewRect = overviewGroup.append('rect')
            .attr('y', height + marginOverview.top)
            .attr('width', width)
            .attr('height', heightOverview)
            .style("opacity", "0")
            .style("cursor", "pointer").on("click", click);
            var selectorWidth = (width / (MIN_BAR_WIDTH) * (xOverview.rangeBand()));

            var displayed = d3.scale
            .quantize()
            .domain([0, width])
            .range(d3.range(data.length));
            var selector=diagram
            .append("rect")
            .attr("transform", "translate(0, " + (height + margin.bottom) + ")")
            .attr("class", "mover")
            .attr("x", 0)
            .attr("y", 0)
            .attr("height", selectorHeight)
            .attr("width", Math.round(parseFloat(numBars * width) / data.length))
            .attr("pointer-events", "all")
            .attr("cursor", "ew-resize")
            .call(d3.behavior.drag().on("drag", display));
            }

            var zoom = d3.behavior.zoom().scaleExtent([1, 1]);

            function click() {
            var newX = null;
            var selectorX = null;
            var customScale = d3.scale.linear().domain([0, width]).range([0, ((MIN_BAR_WIDTH + MIN_BAR_PADDING) * data.length)])

            selectorX = (d3.event.x - marginOverview.left) - selectorWidth / 2;
            newX = customScale(selectorX);
            if (selectorX > width - selectorWidth) {
            newX = customScale(width - selectorWidth);
            selectorX = width - selectorWidth;
            } else if (selectorX - (selectorWidth / 2) < 0) {
            newX = 0;
            selectorX = 0
            }
            selector.transition().attr("x", selectorX)
            bars.transition().duration(300).attr("transform", "translate(" + (-newX) + ",0)");

            diagram.transition().duration(300).select(".x.axis").attr("transform", "translate(" + -(newX - (MIN_BAR_WIDTH + MIN_BAR_PADDING) / 2) + "," + (height) + ")");
            diagram.select(".y.axis").call(yAxis);

            var transformX = (-(d3.event.x - selectorWidth) * ((MIN_BAR_WIDTH + MIN_BAR_PADDING) * data.length) / width);
            zoom.translate([-newX, 0])
            }

            function display() {
            var x = parseInt(d3.select(this).attr("x")),
            nx = x + d3.event.dx,
            w = parseInt(d3.select(this).attr("width")),
            f,
            nf,
            new_data,
            rects;

            if (nx < 0 || nx + w > width) return;

            d3.select(this).attr("x", nx);

            f = displayed(x);
            nf = displayed(nx);

            if (f === nf) return;

            new_data = data.slice(nf, nf + numBars);

            xscale.domain(
            new_data.map(function(d) {
            return d.label;
            })
            );
            diagram.select(".x.axis").call(xAxis);

            rects = bars.selectAll("rect").data(new_data, function(d) {
            return d.label;
            });

            rects.attr("x", function(d) {
            return xscale(d.label);
            });

            rects
            .enter()
            .append("rect")
            .attr("class", "bar")
            .attr("x", function(d) {
            return xscale(d.label);
            })
            .attr("y", function(d) {
            return yscale(d.value);
            })
            .attr("width", xscale.rangeBand())
            .attr("height", function(d) {
            return height - yscale(d.value);
            })
            .on("mouseover", tip2.show)
            .on("mouseout", tip2.hide);

            bartext
            .data(new_data)
            .attr("x", function(d) {
            return xscale(d.label)+20;
            })
            .attr("y", function(d) {
            return yscale(d.value) - 5;
            })
            .text(function(d) {
            return d.value;
            });

            bartext.exit().remove();
            rects.exit().remove();
            }

当我单击X轴滚动条时如何移动条形图? X轴滚动条是实际图形的子图。

0 个答案:

没有答案