【问题标题】:Amcharts: Interpolating step line chart values, show balloon of interpolated valueAmcharts:插值阶梯线图值,显示插值气球
【发布时间】:2015-06-03 12:48:01
【问题描述】:

我是 amCharts 的新手,正在尝试创建一个非常简单的阶梯折线图。

我有数据长时间保持不变,只记录值的变化,例如:

{
    "timeOfDay": "18:20",
    "value": 100
}, {
    "timeOfDay": "19:40",
    "value": 80
}, {
    "timeOfDay": "21:40",
    "value": 20
}, {
    "timeOfDay": "22:40",
    "value": 50
} // and so on

图表应该画一条水平线,直到下一个变化点,然后再画一次,直到下一个,依此类推,我已经设法做到了。但是,目前它只在数据点处显示气球文本,而不是光标所在的位置,如下所示:

在这里,我在 20:15 左右徘徊,尽管截图获取者没有捕捉到我的光标。气球文本显示在最近的数据点。我希望气球文本显示在我的光标处,或者显示在光标所在位置的图表上,并在光标所在位置显示时间。

我知道我可以在现有数据点之间生成新的数据点,但我宁愿不这样做,因为这将是一项相当繁重的操作,因为我希望它以一秒的精度显示时间 - 那就是每小时有数千个数据点,我相信 amCharts 有一个插值选项,用于隐藏某处的时间 - 我试图在 docs/google 上搜索这样的选项,但到目前为止还没有找到。

编辑:此处的当前图表代码:http://pastebin.com/BEZxgtCb

更新:设法使用以下函数提取时间并将事件侦听器附加到 chartCursor 对象 - 但仍然无法让它显示在图表上的预定义点之外的任何其他地方。

var parseDate = function(dateObj) {
    return dateObj.getHours() + ":" + dateObj.getMinutes() + ":" + dateObj.getSeconds();
}

var handleMove = function(event) {
    var time = event.chart.categoryAxis.coordinateToDate(event.x);
    event.chart.graphs[0].balloonText = parseDate(time);
}

【问题讨论】:

  • 自您提出问题后,您是否知道amcharts4 已添加该功能?

标签: javascript amcharts


【解决方案1】:

气球仅显示在实际数据点上,这意味着您需要手动注入它们以在“插值”时间内显示气球。遍历您的数据后,计算先前点之间的距离并在其间注入分钟数。

        var prevTime = undefined;
        var prevValue = undefined;
        var interpolate = [];
        for ( var i1 = 0; i1 < chart.dataProvider.length; i1++ ) {
            var item = chart.dataProvider[i1];
            var curTime = AmCharts.stringToDate(item.timeOfDay,"JJ:NN")
            var curVal = item.value;

            if ( prevTime ) {
                var distance = (Number(curTime) - Number(prevTime)) / 1000 / 60;
                for ( var i2 = 0; i2 < distance; i2++ ) {
                    var newDate = new Date(prevTime);
                    newDate.setMinutes(prevTime.getMinutes() + i2);

                    if ( Number(newDate) < Number(curTime) ) {
                        interpolate.push({
                            timeOfDay: AmCharts.formatDate(newDate,"JJ:NN"),
                            value: prevValue
                        });
                    }
                }
            }

            // NEW ONE
            interpolate.push(item);

            // FOR NEXT TIME
            prevTime = curTime;
            prevValue = curVal;
        }
        chart.dataProvider = interpolate;

很遗憾,没有实现该功能的选项。

【讨论】:

  • 这有点令人失望:/ 我明天试试看,看看有多迟钝。不过还是谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
相关资源
最近更新 更多