【问题标题】:Incremental scatter plot in c3.jsc3.js 中的增量散点图
【发布时间】:2015-01-07 06:17:50
【问题描述】:

我需要使用 c3.js 在散点图中显示数据点。数据点分批到达,我想随着新点的到来逐步更新绘图。

在初始化绘图时给出了第一批,并且显示正常。但是当我使用 flow 更新情节时,较早的点会被删除。此外,X 轴不会显示正确的 X 坐标。 [编辑:添加说明] 流动后,点出现在 (3, 1), (4, 1), (5, 1) 而不是 (1.5, 1), (2.5, 1), (3.5, 1)在数据中指定。]

我错过了什么吗?

JsFiddle:http://jsfiddle.net/cornea/b33usb69/

var chart = c3.generate({
    data: {
        x: 'A',
        columns: [
            ['A', 1.5, 2.5, 3.5],
            ['B', 2.0, 2.0, 2.0]
        ],
        type: 'scatter',
        types: { 'B': 'scatter' }
    },
    axis: {
        x: { label: 'A', tick: { fit: true } },
        y: { label: 'B' }
    }
});

setTimeout(function () {
    chart.flow({
        columns: [
            ['A', 1.5, 2.5, 3.5],
            ['B', 1.0, 1.0, 1.0]
        ]
    });
}, 2000);

谢谢。

【问题讨论】:

  • 由于您的x 值不会改变,我认为在这种情况下您需要设置data.x 并可能使用ids: 来卸载和刷新图表,如C3.js XY chart example 中的为了得到你想要的效果。
  • 答案应该是评论。
  • 通过在流程规范中设置length = 0解决了显示新点时旧点被删除的问题。但是,“流”添加的点仍然显示不正确。 Updated JsFiddle
  • 更新的答案 - 不高兴。如果您找到解决方法,您可以发布您自己问题的答案并接受它。我会投票赞成任何有用的回应。如果您在 C3.js 邮件列表中发布您的问题的链接,其他用户可能有更简单的方法来做您想做的事情。

标签: javascript d3.js c3.js


【解决方案1】:

不知道你为什么使用.flow,时间序列数据不是更多吗?

您不能只使用.load 将新数据点放到图表上吗?

像这样:http://jsfiddle.net/b33usb69/20/

编辑:

如果你希望它在同一个数组中,那么像这样: (代码未测试)

var a = ['A_x', 1.5, 2.5, 3.5], b = ['A', 2.0, 2.0, 2.0];

var chart = c3.generate({
    data: {
        xs: { A: 'A_x' },
        columns: [
             ['A_x', 1.5, 2.5, 3.5],
            ['A', 2.0, 2.0, 2.0]
        ],
        type: 'scatter'
    },
    axis: {
        y: { min: 0, max: 3 }
    }
});

setTimeout(function () {
    a = a.concat[1.5, 2.5, 3.5];
    b = b.concat[1.0, 1.0, 1.0];
    chart.load({
        columns: [
            a,
            b
        ]
    });
}, 2000);

【讨论】:

  • 谢谢。但我需要附加到同一个系列,而不是添加一个新系列。在您的 jsfiddle 中更改 B -> A 和 B_x -> A_x 会显示问题——添加新点时旧点会被删除。
  • 感谢您的编辑。 chart.load 将一遍又一遍地重新绘制早期的点——这是低效的。 chart.flow 方法以增量方式绘制新数据。
【解决方案2】:

因为在您的示例中 Y 轴的比例变化很大(值下降了 50%),您可能需要设置 axis: { y: { min: 0 }, y: { max: 2 } } 才能看到散点移动。试试this jsfiddle 看看该更改是否符合您的要求。

当您使用chart.flow 时,X 轴值会更新,如果您将其更改为使用chart.load({ ... }) 加载和重新加载图表数据,它们将保持不变。要使图表正确地流动数据,需要做更多的工作来初始化 X 轴值(请参阅flow API example),但从您的简单示例中并不清楚这就是您想要做的。


编辑

感谢您的澄清。我无法用工作代码回答您的问题,但请参阅与您的问题相关的github #865 issue for C3.js

您可能需要考虑对数据使用不同的方法并避免使用flow 以构建合适的图表。

【讨论】:

  • 感谢您的回答。问题是当显示新点时旧点被删除了。我可以通过在流规范中设置length = 0 来解决同样的问题。更新了 JsFiddle:jsfiddle.net/cornea/b33usb69/5 剩下的问题是流后,点出现在 (3, 1), (4, 1), (5, 1) 而不是 (1.5, 1), (2.5, 1), (3.5, 1) 如数据中所述。 (抱歉之前没有说清楚)。
  • +1 指出github #865 issue for C3.js。将等待该问题得到解决。谢谢。
猜你喜欢
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多