javascript - 一个 slider ,两个图表,使用 Rickshaw 和 D3.js

标签 javascript slider d3.js rickshaw

我有两张用人力车渲染的图表,非常好。我有一个 slider ,我希望能够操作这两个图,但它现在正在做的是操作我声明的最后一个图:

//graph one
var graph_one = new Rickshaw.Graph( {
        element: document.querySelector("#chart_one"),
        height: 150,
        width: 170,
        renderer: 'bar',
        series: data
} );

//slider code
var slider_one = new Rickshaw.Graph.RangeSlider({
    element: document.querySelector('#slider-range'),
    graph: graph_one
});

graph_one.render();

//graph two
var graph_two = new Rickshaw.Graph( {
        element: document.querySelector("#chart_two"),
        renderer: 'line',
        height: 150,
        width: 170,
        series: data
} );

//slider code
var slider_two = new Rickshaw.Graph.RangeSlider({
    element: document.querySelector('#slider-range'),
    graph: graph_two
});

graph_two.render();

是否可以让一个 slider 操作两个图形?

最佳答案

我通过编辑 rickshaw.js 来完成此操作,特别是编辑 Rickshaw.Graph.RangeSlider 以接受图形数组作为图形变量:

Rickshaw.Graph.RangeSlider = function(args) {

    var element = this.element = args.element;
    var graph = this.graph = args.graph;
    //added by bozdoz
    if(graph.constructor === Array){
            $( function() {
                $(element).slider( {
                    range: true,
                    min: graph[0].dataDomain()[0],
                    max: graph[0].dataDomain()[1],
                    values: [ 
                        graph[0].dataDomain()[0],
                        graph[0].dataDomain()[1]
                    ],
                    slide: function( event, ui ) {
                        //on slide, move both graphs
                        for(var i=0; i < graph.length; i++){
                            graph[i].window.xMin = ui.values[0];
                            graph[i].window.xMax = ui.values[1];
                            graph[i].update();

                            // if we're at an extreme, stick there
                            if (graph[i].dataDomain()[0] == ui.values[0]) {
                                graph[i].window.xMin = undefined;
                            }
                            if (graph[i].dataDomain()[1] == ui.values[1]) {
                                graph[i].window.xMax = undefined;
                            }
                        }
                    }
                } );
            } );
            graph[0].onUpdate( function() {

                var values = $(element).slider('option', 'values');

                $(element).slider('option', 'min', graph[0].dataDomain()[0]);
                $(element).slider('option', 'max', graph[0].dataDomain()[1]);

                if (graph[0].window.xMin == undefined) {
                    values[0] = graph[0].dataDomain()[0];
                }
                if (graph[0].window.xMax == undefined) {
                    values[1] = graph[0].dataDomain()[1];
                }

                $(element).slider('option', 'values', values);

            } );
            ...

然后,在声明图形时,我只需要将 slider 代码添加到最后一个图形,包括两个图形变量作为一个数组:

var slider_two = new Rickshaw.Graph.RangeSlider({
    element: document.querySelector('#slider-range'),
    graph: [graph_one, graph_two]
});

完全按照我希望的方式工作:http://jsfiddle.net/bozdoz/k4NmL/

关于javascript - 一个 slider ,两个图表,使用 Rickshaw 和 D3.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408497/

相关文章:

objective-c - 在文本字段中显示 Unicode 字符

javascript - div 部分中的 d3 图

javascript - 如何将 jquery 插件 (HTML) 包含到 JS 代码中

javascript - 不要将 URL 添加到浏览器历史记录中

javascript - 应用程序被杀死时不会触发 onNotification()

javascript - 在 jquery mobile 中刷新页面

javascript - 需要帮助解决 slider javascript 与 Safari 的冲突

javascript - JQuery - 使用 slider 调整多个不同的 div 宽度

javascript - 堆栈栏的方向和适当的大小

javascript - 以 Angular 6导入js外部文件