Panning and zooming (with navigation plugin)

Code taken from http://people.iola.dk/olau/flot/examples/navigate.html

HTML

<script src="http://people.iola.dk/olau/flot/jquery.flot.js"></script>
<script src="http://people.iola.dk/olau/flot/jquery.flot.navigate.js"></script>
<h1>Flot Examples</h1> 

<div id="placeholder" style="width:600px;height:300px;"></div> 

<p class="message"></p> 

<p>With the navigate plugin it is easy to add panning and zooming.
    Drag to pan, double click to zoom (or use the mouse scrollwheel).</p> 

<p>The plugin fires events (useful for synchronizing several
    plots) and adds a couple of public methods so you can easily build
    a little user interface around it, like the little buttons at the
    top right in the plot.</p>

CSS

h1 { 
 font-size: 3em;   
}
#placeholder .button {
    position: absolute;
    cursor: pointer;
}
#placeholder div.button {
    font-size: smaller;
    color: #999;
    background-color: #eee;
    padding: 2px;
}
.message {
    padding-left: 50px;
    font-size: smaller;
}

JavaScript

$(function() {
    // generate data set from a parametric function with a fractal
    // look


    function sumf(f, t, m) {
        var res = 0;
        for (var i = 1; i < m; ++i)
        res += f(i * i * t) / (i * i);
        return res;
    }

    var d1 = [];
    for (var t = 0; t <= 2 * Math.PI; t += 0.01)
    d1.push([sumf(Math.cos, t, 10), sumf(Math.sin, t, 10)]);
    var data = [d1];


    var placeholder = $("#placeholder");
    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);

    // show pan/zoom messages to illustrate events 
    placeholder.bind('plotpan', function(event, plot) {
        var axes = plot.getAxes();
        $(".message").html("Panning to x: " + axes.xaxis.min.toFixed(2) + " &ndash; " + axes.xaxis.max.toFixed(2) + " and y: " + axes.yaxis.min.toFixed(2) + " &ndash; " + axes.yaxis.max.toFixed(2));
    });

    placeholder.bind('plotzoom', function(event, plot) {
        var axes = plot.getAxes();
        $(".message").html("Zooming to x: " + axes.xaxis.min.toFixed(2) + " &ndash; " + axes.xaxis.max.toFixed(2) + " and y: " + axes.yaxis.min.toFixed(2) + " &ndash; " + axes.yaxis.max.toFixed(2));
    });

    $('<div class="button" style="right:20px;top:20px">zoom in</div>').appendTo(placeholder).click(function(e) {
        e.preventDefault();
        plot.zoom();
    });
    
    // add zoom out button 


    // and add panning buttons
    // little helper for taking the repetitive work out of placing
    // panning arrows


    function addArrow(dir, right, top, offset) {
        $('<img class="button"...