【问题标题】:line graph renders wrongly and problem with the X axis (time), cannot brush the graph - time series dc.js折线图渲染错误且 X 轴(时间)有问题,无法刷图 - 时间序列 dc.js
【发布时间】:2019-11-18 14:29:46
【问题描述】:

我正在为扫描工具创建仪表板。我创建了一堆图表,但被困在绘制折线图以显示有点像时间序列(比如在特定扫描时间填充了多少记录)。我正在使用 dc.js 并尝试了几种方法,但线条无法正确渲染,并且轴有奇怪的东西。

我也刷不了图,抛出“coordinate-grid-mixin.js:1083 Uncaught TypeError: undefined is not a function”。

我有一个 UNIX 时间戳,我将其转换为日期时间,然后使用它们绘制折线图。

//Converting the timestamp
var dateFormatSpecifier = "%m/%d/%Y";
var day_FormatSpecifier = "%d %b %y";
var dateFormat = d3.timeFormat(dateFormatSpecifier);
var dayFormat = d3.timeFormat(day_FormatSpecifier)
var dateFormatParser = d3.timeParse(dateFormatSpecifier);
var numberFormat = d3.format(".2f");


facts.forEach(function(d) { 
    console.log('Before Change : ' + d.timestamp);
    d.date = new Date(d.timestamp * 1000);

    d.month = d3.timeMonth(d.date);
    d.day = d3.timeDay(d.date);

    d.date = dateFormat(d.date);
    d.day = dayFormat(d.day)

    console.log('After Change : ' + d.date + ' ' + d.month + ' '+ d.day);
    // console.log('After Change Month: ' + d.month);
  });

//Plotting

var dateDim = data.dimension(function(d) { return (d.day);});
var groupForSNR = dateDim.group().reduceCount(item => 1);

var time_chart = dc.lineChart("#time-chart");

var minDate = dateDim.bottom(1)[0].date;
console.log('min : ' + minDate);
var maxDate = dateDim.top(1)[0].date;
console.log('max : ' + maxDate);

var xmin = dayFormat(new Date(1559890800*1000))
console.log('xmin : ' + xmin);
var xmax = dayFormat(new Date(1561878000*1000))
console.log('xmin : ' + xmax);

time_chart
    .height(150)
    .transitionDuration(500)
    .margins({top: 10, right: 10, bottom: 20, left: 40})
    .dimension(dateDim)
    .group(groupForSNR)
    .brushOn(true)
    .elasticY(true)
    .y(d3.scaleLinear().domain([0,100]))
    .x(d3.scaleOrdinal().domain(xmin, xmax))
    .xUnits(d3.timeDay);

    time_chart.xAxis().ticks(15);
    time_chart.yAxis().ticks(10);

-

".x(d3.scaleTime().domain(xmin, xmax))" 甚至什么都不显示。

【问题讨论】:

  • 嗨,你能看看this example 及其来源吗?基本上,您将希望使用 Javascript 日期对象作为您的键,然后使用 d3.timeDay 量化为天数(我假设),将 d3.timeDays 指定为 xUnits。似乎我们需要一个适当的使用时间尺度的教程,因为这不断出现......
  • 如果遇到困难,请尝试一下并编辑您的问题。谢谢!
  • 我再次尝试并坚持使用类似的

标签: d3.js dc.js linechart


【解决方案1】:

感谢您的努力。

您的语法稍有偏差,并且您总是希望在使用 D3 时间尺度时使用 JavaScript Date 对象。只有刻度和标签(输出)会被格式化为字符串,所有输入都是日期。

.domain() 总是接受一个数组。

你想要

var minDate = dateDim.bottom(1)[0].day; // Date object
var maxDate = dateDim.top(1)[0].day;

.x(d3.scaleTime().domain([minDate, maxDate]))

不确定这些是否是唯一的问题 - 其他一切看起来都不错,但如果不尝试就很难判断。

只要继续学习,仔细看看例子在做什么,你会很快学会的!

编辑:您会发现日期格式为字符串的示例,输入时带有序数刻度。仅在特定情况下这是一个好主意,我认为这不是其中之一。

【讨论】:

  • 谢谢@Gordon。主要问题是我的 d.date 字段被转换为字符串,这就是为什么当我使用 d3.scaleTime() 时它没有呈现。我修复了它,我的图表正在渲染。 :-D
  • 是的,就是这样。确保所有输入都是日期。通常没有任何理由在输入端处理字符串,或者出于任何原因保留格式化的日期。如果您觉得答案让您走上了正确的道路,请单击绿色复选标记接受答案。谢谢!
  • 嘿,@Gordon 在我尝试用超过 1000 行可视化网页暂停和崩溃时再跟进一次。我发现这只是由于这个折线图,如果我删除它,一切看起来都很正常,其他图表渲染得很好。您知道这种情况的任何解决方法吗?
  • 这根本不正常。 Crossfilter 和 dc.js 可以处理数千行,只要数据被正确聚合,最多可能达到 50 万行。很可能还有其他问题。请使用可重现的示例打开另一个问题或 GitHub 问题。
最近更新 更多