使用d3.js在数据中查找最小日期以绘制svg

zf2sa74q  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(144)

我使用d3.js来可视化一些数据,我对JavaScript和SVG等都是全新的。
我得到了下面的代码,它可以工作

  1. var margin = {top: 20, right: 30, bottom: 30, left: 140},
  2. width = pbi.width - margin.left - margin.right,
  3. height = pbi.height - margin.top - margin.bottom;
  4. var x = d3.time.scale()
  5. .range([0, width]);
  6. var y = d3.scale.ordinal()
  7. .rangeRoundBands([0, height], 0.1, 0.2);
  8. var svg = d3.select("#chart")
  9. .attr("width", width + margin.left + margin.right)
  10. .attr("height", height + margin.top + margin.bottom)
  11. .append("g")
  12. .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
  13. var header = svg.append("g")
  14. .attr("id", "header");
  15. // Title
  16. header.append("text")
  17. .attr("class", "title")
  18. .attr("x", 10)
  19. .attr("y", 15)
  20. .text("The visual");
  21. pbi.dsv(function(Data) {
  22. var mindate = new Date('01-01-1905');
  23. var maxdate = new Date();
  24. x.domain([mindate, maxdate]).nice(d3.time.month);
  25. y.domain(Data.map(function(d) { return d.milestone; }));
  26. svg.append("g")
  27. .attr("class", "x axis")
  28. .attr("transform", "translate(0," + height + ")")
  29. .call(d3.svg.axis().scale(x).orient("bottom"));
  30. svg.append("g")
  31. .attr("class", "y axis")
  32. .call(d3.svg.axis().scale(y).orient("left"));
  33. svg.append("g")
  34. .selectAll(".circle")
  35. .data(Data)
  36. .enter().append("circle")
  37. .attr("cx", function(d) {return x(new Date(d.date))} )
  38. .attr("cy", function(d) {return y(d.milestone)+33; })
  39. .attr("r", 10);
  40. });

接下来我想做的是修改mindate行,以便它动态地查找数据集中的最低日期。到目前为止,它是硬编码的。
类似于var mindate = new Date(d3.min(d.date)),但这肯定不起作用
我的数据格式如下:

  1. {reportingyear:'2016', owner:'***', thing:'a-thing', milestone:'start-date', date:'01/12/10'},
  2. {reportingyear:'2017', owner:'***', thing:'a-thing', milestone:'start-date', date:'01/12/10'},
  3. {reportingyear:'2020', owner:'***', thing:'a-thing', milestone:'start-date', date:'01/12/10'}

(出于安全原因,已取消识别!))
任何提示,以指出我在正确的方向是非常赞赏。
谢谢
在应用下面的帮助后,我知道我遇到了以下错误x1c 0d1x
这段代码是为了在PowerBI中使用而开发的,在d3.js插件中,所以数据实际上是从数据模型中拉出来的,列表数据只是在浏览器中复制svg进行编辑。

qgelzfjb

qgelzfjb1#

首先,如果数据表示为对象列表,日期字段表示为字符串,则应考虑将这些字符串转换为Date对象。从您的示例中不能立即清楚地看出日期格式是什么,但是,假设它是月/日/年,您可以执行该任务,

  1. data = data.map(function (o) {
  2. o.date = new Date(o.date);
  3. return o;
  4. })

然后,您可以计算min为

  1. d3.min(data, o => o.date)

下面是完整的代码:

  1. let data = [
  2. {
  3. reportingyear: "2016",
  4. owner: "***",
  5. thing: "a-thing",
  6. milestone: "start-date",
  7. date: "01/12/10"
  8. },
  9. {
  10. reportingyear: "2017",
  11. owner: "***",
  12. thing: "a-thing",
  13. milestone: "start-date",
  14. date: "01/12/10"
  15. },
  16. {
  17. reportingyear: "2020",
  18. owner: "***",
  19. thing: "a-thing",
  20. milestone: "start-date",
  21. date: "01/12/10"
  22. }
  23. ].map(function (o) {
  24. o.date = new Date(o.date);
  25. return o;
  26. });
  27. let min_date = d3.min(data, o => o.date)
  28. console.log(min_date)
  1. <script src="https://d3js.org/d3.v3.min.js"></script>
展开查看全部

相关问题