【问题标题】:How to plot D3.js gantt chart如何绘制 D3.js 甘特图
【发布时间】:2018-12-18 14:39:36
【问题描述】:

我对 D3js 非常陌生,我正在尝试绘制甘特图。我有下面的代码,它给了我一个图表,但它看起来并不接近我预期的图表。如果有人可以帮助我在下面的代码中出错,那将非常有帮助。 这是我现有的甘特图代码:

var data = [{
    name: "A",
    value: 1,
    value2: 2
}, {
    name: "B",
    value: 4,
    value2: 5
}, {
    name: "C",
    value: 7,
    value2: 9
}, {
    name: "D",
    value: 2,
    value2: 7
}, {
    name: "E",
    value: 1,
    value2: 1
}, {
    name: "F",
    value: 5,
    value2: 2
}]

var margin = {
    top: 30,
    right: 40,
    bottom: 10,
    left: 10
},
    width = 520 - margin.left - margin.right,
    height = 260 - margin.top - margin.bottom;

var x = d3.scaleLinear()
    .range([0, width])

var y = d3.scaleBand()
    .rangeRound([0, height])
    .padding(.3)

var xAxis = d3.axisTop(x);

var svg = d3.select("#barchart").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 + ")");

x.domain([-10, 10])
y.domain(data.map(function (d) {
    return d.name;
}));

svg.selectAll(".bar")
    .data(data)
    .enter().append("rect")
    .attr("class", "bar")
    .attr("x", function (d) {
        return x(Math.min(0, d.value));
    })
    .attr("y", function (d) {
        return y(d.name);
    })
    .attr("width", function (d) {
        return Math.abs(x(d.value) - x(0));
    })
    .attr("height", 13);

svg.selectAll(".bar2")
    .data(data)
    .enter().append("rect")
    .attr("class", "bar2")
    .attr("x", function (d) {
        return x(Math.min(0, -d.value2));
    })
    .attr("y", function (d) {
        return y(d.name);
    })
    .attr("width", function (d) {
        return Math.abs(x(-d.value2) - x(0));
    })
    .attr("height", 13);


svg.append("g")
    .attr("class", "x axis")
    .attr('transform', 'translate(0,' + (height) + ')')
    .call(xAxis);

svg.append("g")
    .attr("class", "y axis")
    .append("line")
    .attr("x1", x(0))
    .attr("x2", x(0))
    .attr("y2", height);   

function type(d) {
    d.value = +d.value;
    return d;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="barchart"></div>

这是我预期的图表。 预期甘特图

【问题讨论】:

  • 看起来很像,有什么问题
  • 您说这是您所期望的图表,但您的代码中没有证据表明您甚至尝试实现很多这些功能。你到底遇到了什么问题?

标签: javascript d3.js


【解决方案1】:

感谢@Tushar 向我指出示例。我能够完善我的图表。以下是精炼后的代码。

<script>
                    data = [{
                        name: "A",
                        value: 1,
                        value2: 2
                    }, {
                        name: "B",
                        value: 4,
                        value2: 5
                    }, {
                        name: "C",
                        value: 7,
                        value2: 9
                    }, {
                        name: "D",
                        value: 2,
                        value2: 7
                    }, {
                        name: "E",
                        value: 1,
                        value2: 1
                    }, {
                        name: "F",
                        value: 5,
                        value2: 2
                    }]

                    var margin = {
                        top: 35,
                        right: 20,
                        bottom: 20,
                        left: 30
                    },
                        width = 580 - margin.left - margin.right,
                        height = 260 - margin.top - margin.bottom;

                    var x = d3.scaleLinear()
                        .range([0, width])

                    var y = d3.scaleBand()
                        .rangeRound([0, height])
                        .padding(.3)

                    var xAxis = d3.axisTop(x);
                    // gridlines in x axis function
                    function make_x_gridlines() {
                        return d3.axisBottom(x)
                            .ticks(40)
                    }

                    var svg = d3.select("#barchart").append("svg")
                        .attr("width", 585)
                        .attr("height", 270)
                        .append("g")
                        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

                    x.domain([-10, 10])
                    y.domain(data.map(function (d) {
                        return d.name;
                    }));

                    svg.selectAll(".bar")
                        .data(data)
                        .enter().append("rect")
                        .attr("class", "bar")
                        .attr("x", function (d) {
                            return x(Math.min(0, d.value));
                        })
                        .attr("y", function (d) {
                            return y(d.name);
                        })
                        .attr("width", function (d) {
                            return Math.abs(x(d.value) - x(0));
                        })
                        .attr("height", 13);

                    svg.selectAll(".bar2")
                        .data(data)
                        .enter().append("rect")
                        .attr("class", "bar2")
                        .attr("x", function (d) {
                            return x(Math.min(0, -d.value2));
                        })
                        .attr("y", function (d) {
                            return y(d.name);
                        })
                        .attr("width", function (d) {
                            return Math.abs(x(-d.value2) - x(0));
                        })
                        .attr("height", 13);


                    //svg.append("g")
                    //    .attr("class", "x axis")
                    //    .attr('transform', 'translate(0,' + (height) + ')')
                    //            .call(xAxis);
                    svg.append("g")
                        .attr("transform", "translate(0," + height + ")")
                        .call(d3.axisBottom(x));

                    // add the X gridlines
                    svg.append("g")
                        .attr("class", "grid")
                        .attr("transform", "translate(0," + height + ")")
                        .call(make_x_gridlines()
                            .tickSize(-height)
                            .tickFormat("")
                        )

                    svg.append("g")
                        .call(d3.axisLeft(y));
                    //svg.append("g")
                    //    .attr("class", "y axis")
                    //    .append("line")
                    //    .attr("x1", x(0))
                    //    .attr("x2", x(0))
                    //    .attr("y2", height);


                    function type(d) {
                        d.value = +d.value;
                        return d;
                    }
                </script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2014-11-02
    相关资源
    最近更新 更多