app.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* global d3, responsivefy */
  2. // D3 convention: define margin as an object called margin with these props:
  3. let margin = {
  4. top: 10,
  5. right: 20,
  6. bottom: 30,
  7. left: 30
  8. };
  9. let width = 400 - margin.left - margin.right;
  10. let height = 600 - margin.top - margin.bottom;
  11. let svg = d3.select(".chart")
  12. .append("svg")
  13. .attr("width", width + margin.left + margin.right)
  14. .attr("height", height + margin.top + margin.bottom)
  15. .call(responsivefy)
  16. .append("g")
  17. .attr("transform", () => `translate(${margin.left},${margin.top})`);
  18. d3.json("data/data.json", function (err, data) {
  19. const parseTime = d3.timeParse("%Y/%m/%d");
  20. // Normalize data.
  21. data.forEach(company => {
  22. company.values.forEach(d => {
  23. d.date = parseTime(d.date);
  24. // Ensure close is an integer.
  25. d.close = +d.close;
  26. });
  27. });
  28. let xScale = d3.scaleTime()
  29. .domain([
  30. d3.min(data, company => d3.min(company.values, d => d.date)),
  31. d3.max(data, company => d3.max(company.values, d => d.date))
  32. ])
  33. .range([0, width]);
  34. svg
  35. .append("g")
  36. .attr("transform", `translate(0, ${height})`)
  37. .call(d3.axisBottom(xScale).ticks(5));
  38. let yScale = d3.scaleLinear()
  39. .domain([
  40. d3.min(data, company => d3.min(company.values, d => d.close)),
  41. d3.max(data, company => d3.max(company.values, d => d.close))
  42. ])
  43. .range([height, 0]);
  44. svg
  45. .append("g")
  46. .call(d3.axisLeft(yScale));
  47. let area = d3.area()
  48. .x(d => xScale(d.date))
  49. .y0(yScale(yScale.domain()[0]))
  50. .y1(d => yScale(d.close))
  51. .curve(d3.curveCatmullRom.alpha(0.5))
  52. ;
  53. svg.selectAll(".area")
  54. .data(data)
  55. .enter()
  56. .append("path")
  57. .attr("class", "area")
  58. .attr("d", d => area(d.values))
  59. // i is the index, alternating 0 and 1 (AMZN orange, GOOG blue).
  60. .style("stroke", (d, i) => ["#FF9900", "#3369E8"][i])
  61. .style("stroke-width", 2)
  62. .style("fill", (d, i) => ["#FF9900", "#3369E8"][i])
  63. .style('fill-opacity', 0.5);
  64. });