Skip to content Skip to sidebar Skip to footer

Updated: Changing The Graph Based On The Slider Date On X Axis

Edit: I have edited the question, earlier values were not reflecting on the x axis now that got resolved .Now as the slider moves the data doesn't change in the graph and i can see

Solution 1:

Adding the clip path functionality because data was going beyond y axis.

    private initSvg() {
        d3.select("svg").remove();
        this.svg = d3.select("#d3Id")
            .append("svg")
            .attr("width", this.width + this.margin.left + this.margin.right)
            .attr("height", this.height + this.margin.top + this.margin.bottom)
            .append("g")
            .attr("transform",
                "translate(" + this.margin.left + "," + this.margin.top + ")")
            .attr("stroke-width", 2);
    }
    private initAxis() {
        // Parse the date / time
        // var parseDate = timeParse("%b %Y");
        // this.formatTime = timeParse("%e %B");

        // Set the ranges
        this.x = d3Scale.scaleTime().range([0, this.width]);
        this.y = d3Scale.scaleLinear().range([this.height, 0]);
    }
    private drawAxis() {
        var X = this.x;
        var Y = this.y;
        this.xAxis = d3.axisBottom(this.x)
            .ticks(5);

        // var xAxis = d3.axisBottom(this.x).tickSize(-this.height).ticks(3);
        // // Add the x-axis.
        // this.svg.append("svg:g")
        //       .attr("class", "x axis")
        //       .attr("transform", "translate(0," + this.height + ")")
        //       .call(xAxis);

        this.yAxis = d3.axisLeft(this.y)
            .ticks(5);
        // Define the line
        this.priceline = d3Shape.line()
            .x(function(d) {
                return X(new Date(d['date']));
            })
            .y(function(d) {
                return Y(d['peoplesum']);
            });
    }
    private drawLine() {

        if (this.data[0]['d3_parameter_maker'] === true) {
            this.x.domain([1, d3.max(this.data, function(d) {
                return parseInt(d['date']);
            })]);
        } else if (this.data[0]['d3_parameter_maker'] === undefined) {
            var mindate = new Date(this.dashboard_date['startTime']),
                maxdate = new Date(this.dashboard_date['endTime']);
            this.x.domain([mindate, maxdate]);
        }

        console.log(new Date(this.dashboard_date['startTime']));

        // Scale the range of the data
        var svgVar = this.svg;
        var pricelineVar = this.priceline;
        var margin = this.margin;
        var height = this.height;
        let thisObj = this;
        this.mouseOver = [];
        let X = this.x;
        let Y = this.y;
        if (this.mouseFlag < 0) {
            for (let i = 0; i < this.peopleInSumArr.length; i++) {
                this.mouseOver[i] = true;
            }
        } else {
            for (let i = 0; i < this.peopleInSumArr.length; i++) {
                if (i !== this.mouseFlag) {
                    this.mouseOver[i] = false;
                }
            }
            this.mouseOver[this.mouseFlag] = true;
        }
        this.y.domain([0, d3.max(this.data, function(d) {
            return d['peoplesum'];
        })]);

        var clip = thisObj.svg.append("defs").append("svg:clipPath")
            .attr("id", "clip")
            .append("svg:rect")
            .attr("id", "clip-rect")
            .attr("x", "0")
            .attr("y", "0")
            .attr("width", this.width)
            .attr("height", this.height);
        // Nest the entries by symbol
        var dataNest = d3.nest()
            .key(function(d) {
                return d['storeid'];
            })
            .entries(this.data);
        // set the colour scale
        var color = d3.scaleOrdinal(d3.schemeCategory10);
        var legendSpace = this.width / dataNest.length; // spacing for the legend
        var div1 = d3.select("body").append("div")
            .attr("class", "tooltip")
            .style("opacity", 0);
        dataNest.forEach(function(data, i) {
            thisObj.svg.append("path")
                .attr("class", "line")
                .style("fill", "none")
                .datum(data)
                .attr("d", function(d) {
                    return thisObj.priceline(d.values);
                })
                .attr('opacity', thisObj.mouseOver !== undefined && thisObj.mouseOver[i] === true ? 1 : 0.2)
                .style('cursor', 'pointer')
                .style("stroke", function() { // Add the colours dynamically
                    return data['color'] = color(data.key);
                })
                .attr("stroke-width", 3)
                .attr("clip-path", "url(#clip)")
                .on('click', function() { // on mouse in show line, circles and text
                    thisObj.mouseFlag = i;
                    thisObj.initSvg();
                    thisObj.initAxis();
                    thisObj.drawAxis();
                    thisObj.drawLine();
                });
            // Add the scatterplot
            thisObj.svg.selectAll("dot")
                .data(data.values)
                .enter().append("circle")
                .attr("r", 5)
                .attr("cx", function(d) {
                    return thisObj.x(new Date(d.date));
                })
                .attr("cy", function(d) {
                    return thisObj.y(d.peoplesum);
                })
                .style('cursor', 'pointer')
                .on("mouseover", function(d) {
                    div1.transition()
                        .duration(200)
                        .style("opacity", .9);
                    // tslint:disable-next-line:no-unused-expression
                    div1.html("<b>Date: </b>" + d.date + "<br/>" + "<b>Sum: </b>" + d.peoplesum.toFixed(2))
                        .style('position', 'absolute')
                        .style("left", (d3.event.pageX) + "px")
                        .style("top", (d3.event.pageY - 28) + "px")
                        .style('text-align', 'center')
                        .style('width', '100px')
                        .style('height', '30px')
                        .style('padding', '2px')
                        .style('font', '12px sans-serif')
                        .style('background-color', 'lightsteelblue')
                        .style('border', '0px')
                        .style('border-radius', '8px')
                        .style('cursor', 'pointer')
                        .style('pointer-events', 'none');
                })
                .on("mouseout", function(d) {
                    div1.transition()
                        .duration(500)
                        .style("opacity", 0);
                });

            // Add the X Axis


            // Add the Y Axis

            thisObj.svg.append("text")
                .attr("x", (legendSpace / 2) + i * legendSpace) // space legend
                .attr("y", height + (margin.bottom / 2) + 5)
                .attr("class", "legend") // style the legend
                .style('cursor', 'pointer')
                .style("fill", function() { // Add the colours dynamically
                    return data['color'] = color(data.key);
                })
                .text(data.key)
                .attr("stroke-width", 3)
                .on('click', function() { // on mouse in show line, circles and text
                    thisObj.mouseFlag = i;
                    thisObj.initSvg();
                    thisObj.initAxis();
                    thisObj.drawAxis();
                    thisObj.drawLine();
                });
        });
        // Add the X Axis
        let xAxisSelection = this.svg.append("g")
            .attr("class", "x-axis")
            .attr("transform", "translate(0," + this.height + ")")

        xAxisSelection.call(d3.axisBottom(this.x));

        // Add the Y Axis
        this.svg.append("g")
            .attr("class", "axis")
            .call(d3.axisLeft(this.y));
        if (this.data[0]['d3_parameter_maker'] === undefined) 
        {
          this.daily_Data_slider(mindate,xAxisSelection,maxdate)    
        }
       else 
        {
          this.hourly_Data_slider(xAxisSelection)    
        }
   }

  private daily_Data_slider(mindate,xAxisSelection,maxdate){
    var svgVar = this.svg;
        var pricelineVar = this.priceline;
        var margin = this.margin;
        var height = this.height;
        let thisObj = this;
    function zoom(begin, end) {

            thisObj.x.domain([new Date(begin), new Date(end)]);
            var t = thisObj.svg.transition().duration(0);

            var size = moment(moment(end).toDate()).diff(moment(begin).toDate(), 'days');
            console.log("size", size);
            var step = size / 10;
            var ticks = [];
            const startDate = new Date(moment(begin).toDate());
            for (var i = 0; i <= 10; i++) {
                var xAxisDate = new Date(moment(begin).toDate())
                // Add a day
                xAxisDate.setDate(startDate.getDate() + i)

                ticks.push(xAxisDate);
            }

            xAxisSelection.call(d3.axisBottom(thisObj.x.domain(d3.extent(ticks))));
            // Redraw the line:    
            d3.selectAll("circle")
                .attr("cx", function(d) {
                    return thisObj.x(new Date(d.date));
                })
                .attr("cy", function(d) {
                    return thisObj.y(d.peoplesum);
                })

            d3.selectAll(".line").attr("d", function(d) {
                return thisObj.priceline(d.values);
            })
        }

        //console.log("this.data)",this.data)
        $(function() {
            $("#slider-range").slider({
                range: true,
                min: new Date(mindate).getTime() / 1000,
                max: new Date(maxdate).getTime() / 1000,
                step: 86400,
                values: [new Date(mindate).getTime() / 1000, new Date(maxdate).getTime() / 1000],
                slide: function(event, ui) {
                    //console.log("ui.values[0]",ui.values)

                    var begin = d3.min([(new Date(ui.values[0] * 1000).toDateString()), thisObj.data.length]);
                    var end = new Date(ui.values[1] * 1000).toDateString(); // 0]);
                    //console.log("begin:", moment(begin).toDate(), "end:", moment(end).format('yyyy-mm-dd'), thisObj.data);
                    console.log("begin", begin);
                    console.log("end", end);

                    if (new Date(moment(moment(moment(begin).toDate()).add(10, 'days')).format("YYYY-MM-DD")) <= new Date(end)) {
                        zoom(begin, end);
                    }

                }
            });
        });
  }

Post a Comment for "Updated: Changing The Graph Based On The Slider Date On X Axis"