如何在d3图表中给出折线图选项

时间:2016-05-06 20:07:06

标签: javascript html d3.js charts

我有一个d3图表,其中条形图是类型,但我想包括折线图类型。我想在网页上给出两个选项,以便用户可以在任何条形图或折线图之间切换。请问如何做到这一点 下面是我的HTML

 <!doctype html>
    <html>

    <head>
        <meta charset="UTF-8">
        <meta content="utf-8" http-equiv="encoding">

        <title>D3</title>
        <!-- <link rel="stylesheet" type="text/css" href="mystyle1.css" /> -->

        <style>
            body {
                color: #000;
            }

            .axis {
                font: 10px sans-serif;
            }

            .axis path,
            .axis line {
                fill: none;
                stroke: #000;
                shape-rendering: crispEdges;
            }

            .bar {
                fill: steelblue;
            }

            .bar:hover {
                fill: brown;
            }


            #upleft { width:320px; height: 600px; background:red; float:left; }
            #upright { width:800px; height:50px; background:green; float:left }
            #below { height:600px; width:1120px; background:blue }

        </style>

        <script type="text/javascript" src="http://mbostock.github.com/d3/d3.js"></script>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
        <script src="123.js" type="text/javascript"></script>
    </head>
    <script src="http://d3js.org/d3.v3.min.js"></script>

    <body>
      <div id="upleft">
    <label> List of Tables : </label><br>
    <div>
            <select id="dropdown1"></select>
       </div>
        <style>
            #listbox {
                display: none;
            }
            #listbox {
                position: relative;
            }
        </style>
        <div style="margin-left: 150px; margin-top: -30px; height: auto;">

            <select id="listbox", multiple></select>
        </div>

    </div>
    <div id="upright">
        <div align="left">
        From : <input type="date" name="field1" id="field1" /> To : <input type="date" name="field2" id="field2" />
        <input type="button" onclick="render(true)" value="Submit"/>
    </div>

    </div>
    <div id="below">

    <div id="chart"></div>
    </div>

    <script>
        var jsonURL = 'avb.json';
        var myData = [];
        var fliterdata=[];
        var tempdata=[];
        var selectop="";
         var selectDate = false;
    function filterJSON(json, key, value) {
       var result = [];
      for (var foo in json) {

        if (json[foo][key] == value) {
          result.push(json[foo]);


        }
      }
      return result;
    }

    function selectValue(d){
       // console.log("before op",selectop );
      switch(selectop){   //d object select particular value for Y axis 
                case "01":
                    return d.val001;
                    break;
                case "02":
                    return d.val002;
                    break;
                case "03":
                    return d.val003;
                    break;
                case "04":
                    return d.val004;
                    break;
                case "05":
                    return d.val005;
                    break;
                default:
                    //console.log("default");
                    return d.val001;
            }  
     }
            var margin = {
            top: 20,
            right: 0,
            bottom: 80,
            left: 40
        };
        var width = 700 - margin.left - margin.right;
        var height = 500 - margin.top - margin.bottom;
        var xScale = d3.scale.ordinal().rangeRoundBands([0, width], .1);
        var yScale = d3.scale.linear().range([height, 0]);
        var hAxis = d3.svg.axis().scale(xScale).orient('bottom').tickFormat(d3.time.format("%Y-%m-%d"));
        var vAxis = d3.svg.axis().scale(yScale).orient('left');
        var tooltip = d3.select('body').append('div')
                .style('position', 'absolute')
                .style('background', '#f4f4f4')
                .style('padding', '5 15px')
                .style('border', '1px #333 solid')
                .style('border-radius', '5px')
                .style('opacity', 'o');

   function render(filterByDates) {
            d3.select('svg').remove();

            if (filterByDates) {
                    selectDate=true;
                    tempData=fliterdata;
                    console.log("before date fliter data", tempData);
                var date1 = new Date(document.getElementById('field1').value);
                var date2 = new Date(document.getElementById('field2').value);

                 tempData = tempData.filter(function(d) {
                    console.log(date1,date2);
                  //  alert(date1);
                    return d.date >= date1 && d.date <= date2;


                });
                    console.log("After date fliter data", tempData);
            }


            xScale.domain(tempData.map(function(d) {
                        return d.date;
                    })  .sort(function(a,b) {
                      return a > b;
                    })
            );

            yScale.domain([0, d3.max(tempData, function(d) {
                return +selectValue(d);
            })]);

            var svg = d3.select('#chart').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 + ")");

            svg

                    .append('g')
                    .attr("class", "x axis")
                    .attr("transform", "translate(0," + height + ")")
                    .call(hAxis)
                    .selectAll("text")
                    .style("text-anchor", "end")
                    .attr("dx", "-.8em")
                    .attr("dy", "-.55em")
                    .attr("transform", "rotate(-90)");

            svg
                    .append('g')
                    .attr("class", "yaxis")
                    .call(vAxis)

            svg
                    .selectAll(".bar") //makes bar
                    .data(tempData)
                    .enter().append("rect")
                    .attr("class", "bar")
                    .style("fill", "red")
                    .attr("x", function(d) {
                        return xScale(d.date);
                    })



                    .attr("width", xScale.rangeBand())
                    .attr("y", function(d) {


                        return yScale(selectValue(d));
                    })
                    .attr("height", function(d) {

                        console.log("as", d.value);
                        return height - yScale(selectValue(d));
                    })

        }
        d3.json(jsonURL, function(data) {

            myData = data; //data from json in mydata
            myData.forEach(function(d) {

                d.date = new Date(d.date);
                //d.value="";

                //d.name = +d.name;
                console.log(d.date,"Gt date");
                d.date = new Date(d.date + " UTC");
                console.log(d.date,"localtimezone date");
            });

             $("#listbox").on("click", function() {

                var key = $(this).val();
                console.log("key:", key);
                var value=$('#listbox option:selected').text();
                console.log("vaue:", value);

                selectop=String(key);

                selectop=selectop.slice(-2);
                 console.log("mydata: ", myData);
                 console.log("selectops:",selectop );

                fliterdata=filterJSON(myData, key, value); 
                tempData=fliterdata;  //graph made by temp data
                if (selectDate)
                        render(true);
              });   
        });
    </script> 
    </body>
    </html>

0 个答案:

没有答案