【问题标题】:Flot Charts - Drag / Zoom two or more charts at the same time using flot.navigate pluginFlot Charts - 使用 flot.navigate 插件同时拖动/缩放两个或多个图表
【发布时间】:2014-02-09 01:00:19
【问题描述】:

我在同一页面上显示了两个或多个浮动图表,并使用 flot.navigate 插件进行拖动和缩放。我可以独立于其他图表缩放和拖动单个图表,但我希望其他图表与应用导航操作的图表一起移动或缩放。有些页面可能只有两个图表,而有些页面可能有五个或六个图表

我的小提琴显示了两个图表,一个可以缩放(鼠标滚动)或仅拖动一个图表。非常感谢任何想法或帮助。谢谢。

http://jsfiddle.net/mashinista/cPNNJ/

<div id="placeholder1" style="width: 600px; height: 300px; padding: 0px; position: relative; cursor: auto;"></div>

$(function () {

var d1 = [];
for (var i = 0; i < Math.PI * 2; i += 0.25)
    d1.push([i, Math.sin(i)]);
var data = [ d1 ];

var d2 = [];
for (var i = 0; i < Math.PI * 2; i += 0.25)
    d2.push([i, Math.cos(i)]);
var data2 = [ d2 ];



var options = {
    series: { lines: { show: true }, shadowSize: 0 },
    xaxis: { zoomRange: [0.1, 10], panRange: [-10, 10] },
    yaxis: { zoomRange: [0.1, 10], panRange: [-10, 10] },
    zoom: {
        interactive: true
    },
    pan: {
        interactive: true
    }
};


var plot = $.plot(placeholder, data, options);
var plot = $.plot(placeholder1, data2, options);


});

【问题讨论】:

    标签: jquery graph navigation flot


    【解决方案1】:

    我修改了你的 jsfiddle:http://jsfiddle.net/cPNNJ/4/

    我创建了一个绘图对象数组。每个$.plot() 都存储在数组中。接下来,需要为plothoverplotzoom 事件创建事件处理程序。

    当事件处理程序被调用时,代码将循环遍历绘图数组中的绘图对象,并将 x 和 y 轴的最小值和最大值设置为传递的绘图对象 x 和 y 轴的最小值和最大值。

    $(function () {
        var plots = [];
        var placeholders = $(".flot");
    
        var d1 = [];
        for (var i = 0; i < Math.PI * 2; i += 0.25)
            d1.push([i, Math.sin(i)]);
        var data = [ d1 ];
    
        var d2 = [];
        for (var i = 0; i < Math.PI * 2; i += 0.25)
            d2.push([i, Math.cos(i)]);
        var data2 = [ d2 ];
    
        var options = {
            series: { lines: { show: true }, shadowSize: 0 },
            xaxis: { zoomRange: [0.1, 10], panRange: [-10, 10] },
            yaxis: { zoomRange: [0.1, 10], panRange: [-10, 10] },
            zoom: {
                interactive: true
            },
            pan: {
                interactive: true
            }
        };
    
        plots.push($.plot(placeholder, data, options));
        plots.push($.plot(placeholder1, data2, options));
    
        placeholders.bind("plotpan plotzoom", function (event, plot) {
            var axes = plot.getAxes();
            for(var i=0; i< plots.length; i++) {
                plots[i].getOptions().xaxes[0].min = axes.xaxis.min;
                plots[i].getOptions().xaxes[0].max = axes.xaxis.max;
                plots[i].getOptions().yaxes[0].min = axes.yaxis.min;
                plots[i].getOptions().yaxes[0].max = axes.yaxis.max;
                plots[i].setupGrid();
                plots[i].draw();
            }
        });
    
    });
    

    【讨论】:

    • 很好的答案。我唯一要添加的是检查您的for 循环以跳过事件发生的情节。它会被插件重新绘制,没有必要再做一次。更新小提琴:jsfiddle.net/larsenmtl/cPNNJ/6
    • 感谢您的回答 prmech,这正是我想要的。不确定是否应该发布新问题,但我想知道是否可以添加其他功能。例如,一旦我将图表拖到右侧,我希望有一个带有返回/历史功能的按钮,它将带我回到以前的图表显示状态。我知道重置功能,但此功能会记住缩放/拖动操作,并允许调用用户在图表上应用的先前状态。
    • @user3288556,这是一个实现history的简单示例:jsfiddle.net/larsenmtl/cPNNJ/9。它通过在用户停止移动窗口 500 毫秒后记录轴位置来工作(使用 setInterval)。
    • 马克,这太棒了。非常感谢您的时间和精力。
    【解决方案2】:

    类似的不同方法是this

    JSFillde

    此示例仅同步 PANNING。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多