【问题标题】:D3js - change Vertical bar chart to Horizontal bar chartD3js - 将垂直条形图更改为水平条形图
【发布时间】:2013-04-24 21:42:03
【问题描述】:

我有一个成对分组的垂直条形图。我试图玩弄如何水平翻转它。在我的例子中,关键字会出现在 y 轴上,而比例会出现在 x 轴上。

我尝试切换各种 x/y 变量,但这当然只会产生奇怪的结果。为了将代码从垂直条切换到水平条,我需要关注代码的哪些区域?

My JSFiddle: Full Code

var xScale = d3.scale.ordinal()
    .domain(d3.range(dataset.length))
    .rangeRoundBands([0, w], 0.05);

// ternary operator to determine if global or local has a larger scale
var yScale = d3.scale.linear()
    .domain([0, d3.max(dataset, function (d) {
    return (d.local > d.global) ? d.local : d.global;
})])
    .range([h, 0]);

var xAxis = d3.svg.axis()
    .scale(xScale)
    .tickFormat(function (d) {
        return dataset[d].keyword;
    })
    .orient("bottom");

var yAxis = d3.svg.axis()
    .scale(yScale)
    .orient("left")
    .ticks(5);

var commaFormat = d3.format(',');

//SVG element
var svg = d3.select("#searchVolume")
    .append("svg")
    .attr("width", w + margin.left + margin.right)
    .attr("height", h + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// Graph Bars
var sets = svg.selectAll(".set")
    .data(dataset)
    .enter()
    .append("g")
    .attr("class", "set")
    .attr("transform", function (d, i) {
        return "translate(" + xScale(i) + ",0)";
    });

sets.append("rect")
    .attr("class", "local")
    .attr("width", xScale.rangeBand() / 2)
    .attr("y", function (d) {
        return yScale(d.local);
    })
    .attr("x", xScale.rangeBand() / 2)
    .attr("height", function (d) {
        return h - yScale(d.local);
    })
    .attr("fill", colors[0][1])
    ;

sets.append("rect")
    .attr("class", "global")
    .attr("width", xScale.rangeBand() / 2)
    .attr("y", function (d) {
        return yScale(d.global);
    })
    .attr("height", function (d) {
    return h - yScale(d.global);
    })
    .attr("fill", colors[1][1])
    ;

    sets.append("rect")
        .attr("class", "global")
        .attr("width", xScale.rangeBand() / 2)
        .attr("y", function (d) {
        return yScale(d.global);
    })
        .attr("height", function (d) {
        return h - yScale(d.global);
    })
        .attr("fill", colors[1][1])
    ;

【问题讨论】:

    标签: javascript d3.js bar-chart


    【解决方案1】:

    我昨晚刚刚做了同样的事情,我基本上最终重写了代码,因为它比修复所有错误更快,但这里是我可以给你的提示。

    翻转 x 和 y 轴的最大问题是 return h - yScale(d.global) 之类的东西,因为高度是从页面的“顶部”而不是底部计算的。

    要记住的另一件事是,当您设置 .attr("x", ..) 时,请确保将其设置为 0(加上左侧的任何填充)所以 = .attr("x", 0)"

    我使用本教程来帮助我用水平条来思考我自己的代码 - 它真的很有帮助

    http://hdnrnzk.me/2012/07/04/creating-a-bar-graph-using-d3js/

    这是我自己的代码,如果有帮助的话,可以让它水平:

    var w = 600;
    var h = 600;
    var padding = 30;
    
    var xScale = d3.scale.linear()
            .domain([0, d3.max(dataset, function(d){
                                    return d.values[0]; })]) //note I'm using an array here to grab the value hence the [0]
            .range([padding, w - (padding*2)]);
    
            var yScale = d3.scale.ordinal()
                .domain(d3.range(dataset.length))
                .rangeRoundBands([padding, h- padding], 0.05);
    
            var svg = d3.select("body")
                .append("svg")
                .attr("width", w)
                .attr("height", h)
    
            svg.selectAll("rect")
                .data(dataset)
                .enter()
                .append("rect")
                .attr("x", 0 + padding)
                .attr("y", function(d, i){
                return yScale(i);
                })
                .attr("width", function(d) {
                    return xScale(d.values[0]);
                })
                .attr("height", yScale.rangeBand())
    

    【讨论】:

    【解决方案2】:

    另一种方法是旋转图表(请参阅this)。这有点笨拙,因为您需要在头脑中维护交换的轴(高度实际上是宽度等),但如果您已经有一个有效的垂直图表,它可以说更简单。

    下面是一个旋转图表的示例。您可能还需要旋转文本以使其美观。

    _chart.select('g').attr("transform","rotate(90 200 200)");
    

    【讨论】:

      【解决方案3】:

      这是我在这种情况下使用的过程:

      1) 反转所有 Xs 和 Ys

      2) 请记住,y 的 0 位于顶部,因此您必须反转很多值,因为 y 的先前值将被反转(您不希望 x 轴从左到右移动)并且新的 y 轴也将反转。

      3) 确保条形图正确显示

      4) 如果有问题,调整图例

      这个问题可能有助于说明如何从水平条形图变为垂直:d3.js histogram with positive and negative values

      【讨论】: