x轴与D3折线图变焦(x-axis zooming with d3 line charts)

2019-10-18 15:58发布

我刚刚进入使用D3,和JS还比较初级。 我试图建立日志文件可视化的页面一些监视服务器。 现在我专注的只是CPU的利用率,在那里我可以专注于特定的时间段(因此,只有一个X-变焦)的折线图。 我能够轻松地做一个静态的图表,但是当涉及到缩放的例子会超过我的头,我似乎无法使他们的工作。

这是静态的例子我也跟着得到的东西和运行,而这是我一直努力遵循变焦例子。

我输入CSV是从滚动的日志文件(这不会在第一行上标有),每行看起来是这样的:

datetime,server,cpu,memory,disk,network_in,network_out

到目前为止,我已经能够得到变焦看起来是这样的:

var parseDate = d3.time.format("%Y-%m-%d %H:%M:%S").parse;

// define dimensions of graph
var margin = {top: 20, right: 80, bottom: 30, left: 50},
width = 960 - margin.left - margin.right,
height = 200 - margin.top - margin.bottom;

var x = d3.time.scale().range([0, width]);
var y = d3.scale.linear().range([height, 0]);

var xAxis = d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .tickSize(-height, 0)
    .tickPadding(6);

var yAxis = d3.svg.axis()
    .scale(y)
    .orient("left")
    .tickSize(-width)
    .tickPadding(6);

// Define how we will access the information needed from each row
var line = d3.svg.line()
    .interpolate("step-after")
    .x(function(d) { return x(d[0]); })
    .y(function(d) { return y(d[2]); });

// Insert an svg element into the document for each chart
svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// Declare zoom handler
var zoom = d3.behavior.zoom().on("zoom", draw);

// Open the log and extract the information
d3.text("log.csv", function(text) {
    var data = d3.csv.parseRows(text).map(function(row) {
        return row.map(function(value, index) {
            if (index == 0) {
                return parseDate(value);
            }
            else if (index > 1) {
                return +value;
            }
            else {
                return value;
            }
        });
    });

    // Set the global minimum and maximums
    x.domain(d3.extent(data, function(d) { return d[0]; }));
    y.domain(d3.extent(data, function(d) { return d[2]; }));
    zoom.x(x);

    // Finally, we have the data parsed, and the parameters of the charts set, so now we
    // fill in the charts with the lines and the labels
    svg.append("g")
        .attr("class", "x axis")
        .attr("transform", "translate(0," + height + ")")
        .call(xAxis);

    svg.append("g")
        .attr("class", "y axis")
        .call(yAxis)
        .append("text")
        .attr("transform", "rotate(-90)")
        .attr("y", 6)
        .attr("dy", ".71em")
        .attr("text-anchor", "end")
        .text("Percent (%)");

    svg.append("path")
        .datum(data)
        .attr("class", "line")
        .attr("d", line);

    svg.append("text")
        .attr("x", margin.left)             
        .attr("y", 0 - (margin.top / 2))
        .attr("text-anchor", "middle")  
        .text('all');

    svg.append("rect")
        .attr("class", "pane")
        .attr("width", width)
        .attr("height", height)
        .call(zoom);

    svg.select("path.line").data([data]);
    draw();
});

function draw() {
    svg.select("g.x.axis").call(xAxis);
    svg.select("g.y.axis").call(yAxis);
    svg.select("path.line").attr("d", line);
}

这是什么给了我是一个非常缓慢的图表可以缩放和平移,但它并没有在图表的两端剪掉就行了。 我试着将在实例中描述的剪裁元素,但最终每次都完全删除我行。

感谢您的任何帮助或方向

文章来源: x-axis zooming with d3 line charts