2014-04-12 6 views
5

मुझे यह snippet किसी और के question में मिला जो वास्तव में मुझे चाहिए - के साथ एक लाइन चार्ट एकाधिक डेटासेट के बीच स्विच करने के लिए एक ड्रॉपडाउन बॉक्स। बात यह है कि, मैं इसके बजाय एक PHP उत्पन्न जेएसओएन फ़ाइल से बाहरी रूप से लोड करना चाहता हूं लेकिन मुझे सच में यकीन नहीं है कि मैं यह कैसे कर सकता हूं। उदा सेd3.js: ड्रॉपडाउन परिवर्तन पर विभिन्न JSON डेटासेट लोड करना

d3.taos = function (config) { 

    // Margins and graph formatting. 
    var margin = { 
     top: 20, 
     right: 20, 
     bottom: 20, 
     left: 60 }, 

     width = 960 - margin.left - margin.right, 
     height = 400 - margin.top - margin.bottom, 
     x = d3.time.scale(), // different scaling. 
     y = d3.scale.linear(), 
     xAxis = d3.svg.axis().scale(x).orient("bottom").ticks(5), 
     yAxis = d3.svg.axis().scale(y).orient("left").ticks(5), 
     line = d3.svg.line(), 
     color = d3.scale.category10(), 
     zoom = d3.behavior.zoom().scaleExtent([0.5, 50]); 


    // The chart itself. 
    var chart = function (selection) { 
     dataset = selection.data()[0]; 

     // Select the svg element, if it exists. 
     var svg = selection.selectAll("svg").data([dataset]) 
      .attr("width", width + margin.left + margin.right) 
      .attr("height", height + margin.top + margin.bottom); 

     // Otherwise, create the skeletal chart. 
     var gEnter = svg.enter().append("svg") 
      .append("g") 
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

     // Rendering both axes. 
     gEnter.append("g").attr("class", "x axis"); 
     gEnter.append("g").attr("class", "y axis"); 

     gEnter.append("defs").append("clipPath") 
      .attr("id", "clip") 
      .append("rect") 
      .attr("id", "clip-rect") 
      .attr("x", "0") 
      .attr("y", "0") 
      .attr("width", width) 
      .attr("height", height); 

     x.range([0, width]) 
      .domain(d3.extent(d3.merge(dataset), function (d) { 
       return d.x; 
      })) 

     y.range([height, 0]) 
      .domain(d3.extent(d3.merge(dataset), function (d) { 
       return d.y; 
      })) 

     var g = svg.select("g"); 

     // Update the x-axis. 
     g.select(".x.axis") 
      .attr("transform", "translate(0," + height + ")") 
      .call(xAxis); 

     // Update the y-axis. 
     g.select(".y.axis") 
      .call(yAxis); 

     // Define lines 
     line = d3.svg.line() 
      .x(function (d) { 
       return x(d.x); 
      }) 
      .y(function (d) { 
       return y(d.y); 
      }) 

     var path = g.selectAll(".line") 
      .data(dataset) 
      .enter().append("path") 
      .style("stroke", function (d, i) { 
       return color(i) 
      }); 

     path.attr("class", "line") 
      .attr("d", line) 
      .attr("clip-path", "url(#clip)"); 

     // Update the clip rectangle 
     g.select("#clip-rect") 
      .attr("width", width) 
      .attr("height", height); 

     // Update the line path. 
     g.selectAll(".line") 
      .attr("d", line); 

     zoom.x(x).y(y) 
      .on("zoom", draw); 

     // Rect for zoom. 
     gEnter.append("rect") 
      .attr("class", "rectzoom") 
      .attr("width", width) 
      .attr("height", height) 
      .call(zoom); 

     function draw() { 
      g.select(".x.axis").call(xAxis); 
      g.select(".y.axis").call(yAxis); 
      g.selectAll("path.line").attr("d", line); 
      //g.select("#clip-rect").attr("width",width).attr("height",height); 
     } 

     /* 
     * Methods 
     */ 

     chart.width = function (w) { 
      if (!arguments.length) return width; 
      width = w; 
      return this; 
     }; 

     chart.height = function (h) { 
      if (!arguments.length) return height; 
      height = h; 
      return this; 
     }; 

     return chart 

    } // chart 

    return chart 

}; // d3.taos 





/* 
* Main 
*/ 

// for json: 


// New instance 
var t = d3.taos(); 

var f = function() {} 



var data = d3.json("api.json?id=1", function(error, data) { 
    if (error) return console.warn(error); 
    // Creation 
    d3.select("svg#chart") 
     .datum(data) 
     .attr("x", function(d) { x(d.x) }) 
     .call(t); 
}); 

// Update 
d3.select("select").on("change", function() { 

    var val = $("select#dataset").val(); 



    val == "dataset1" ? dataset = dataset1 : dataset = dataset2; 

    console.log("Dataset changed: " + val); 

    d3.select("svg#chart") 
     .datum(dataset) 
     .call(t.width(800)); 


}); 

और एचटीएमएल कोड ...

<select id="dataset"> 
     <option value="1" selected>Dataset 1</option> 
     <option value="2">Dataset 2</option> 
     <option value="3">Dataset 3</option> 
    </select> 

नमूना JSON डाटासेट api.json?id=1

{ 

     "usability_index": [ 
      {"x": 1397220093000, "y": 7}, 
      {"x": 1397222093000, "y": 21}, 
      {"x": 1397224093000, "y": 13}, 
      {"x": 1397226093000, "y": 23} 
     ] 

} 

मैं d3.json() साथ का पता लगाया है, लेकिन मैं काफी यकीन है कि यह गतिशील लोड हो रहा है जब उदा के बारे में जाने के लिए कैसे नहीं कर रहा हूँ डिफ़ॉल्ट डेटासेट विकल्प को डेटासेट 3 में बदल दिया गया है, api.json?id=1 से api.json?id=3 तक।

मैं वास्तव में d3.js के लिए नया हूं और वास्तव में यहां कुछ मार्गदर्शन की सराहना करता हूं!

+0

इस [bl.ock] (http://bl.ocks.org/phil-pedruco/9087479) पर नज़र डालने का प्रयास करें। आपको 'd3.json ("path/to/url", फ़ंक्शन (त्रुटि, डेटा) {// कुछ पंक्ति चार्ट सामग्री}}' परिवर्तन फ़ंक्शन में पैटर्न का उपयोग करने की आवश्यकता होगी। – user1614080

+1

क्या आप किसी और के पास यह प्रश्न पूछने पर अपना समाधान उत्तर के रूप में पोस्ट करना चाहते हैं? आप जवाब भी स्वीकार कर सकते हैं। – user1614080

+0

सभी को धन्यवाद! पता चला कि c3.js या nvd3.js जैसे पुन: प्रयोज्य चार्ट लाइब्रेरी गतिशील डेटा के लिए अच्छे हैं। मैंने इसके बजाए c3.js का इस्तेमाल किया। –

उत्तर

2

आप इस तरह कुछ कोशिश कर सकते हैं, लेकिन इसके बजाय d3.js. पर आधारित library that makes reusable charts का उपयोग कर सकते हैं।

{ 
    "line1": [220, 240, 270, 250, 280], 
    "line2": [180, 150, 300, 70, 120], 
    "line3": [200, 310, 150, 100, 180] 
} 

इसलिए, आप की जरूरत है:

निम्नलिखित आप कैसे कर सकते थे एपीआई के माध्यम से load data कॉल

var chart = c3.generate({ 
    data: { 
     url: 'api.json?id=1', 
     mimeType: 'json' 
    } 
}); 

ध्यान दें कि c3.js प्रारूप में अपने JSON की अपेक्षा करती है पर एक उदाहरण है इससे पहले कि आप इसे लोड कर सकें, अपने JSON डेटा को पार्स और फिर से प्रारूपित करें।

और ईवेंट हैंडलर संलग्न करें जिन्हें आप चारों ओर पुन: उत्पन्न करने या लोड करने के लिए चुन सकते हैं टी।