javascript - D3.js分组条形图

标签 javascript svg d3.js charts

我正在使用 D3.js 制作条形图,如下所示 bar chart
(来源:statcan.gc.ca)

但它应该是垂直的。所以我可以通过两组数据进行比较。 我使用 http://bost.ocks.org/mike/bar/2/ 中的教程为了进行比较,我构建了两个类“chart”和“chart1”,并分别给它们提供数据,但它只显示第一个 svg 图表。问题是什么? 这是代码 http://jsfiddle.net/x8rax/

<meta charset="utf-8">
<style>

.chart rect {
  fill: rgb(203, 232, 118);
}

.chart2 rect {
  fill: rgb(50, 50, 50);
}

.chart text {
  fill: white;
  font: 10px sans-serif;
  text-anchor: end;
}

</style>
<svg class="chart"></svg>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>

var data = [4, 8, 15, 16, 23, 42];


var width = 420,
    barHeight = 80;

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);


var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);


var bar = chart.selectAll("g")
    .data(data)
  .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + i * barHeight +")"; });

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 60);


bar.append("text")
    .attr("x", function(d) { return x(d) - 3; })
    .attr("y", barHeight / 2)
    .attr("dy", ".35em")
    .text(function(d) { return d; });


//data is not so much interesting here.
</script>

<svg class = "chart2"></svg>
<script>
var data2 = [10, 10, 10, 10, 10, 10];

var width = 420,
    barHeight = 80;

var x2 = d3.scale.linear()
    .domain([0, d3.max(data2)])
    .range([0, width]);

var chart2 = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);

var bar2 = chart.selectAll("g")
    .data(data2)
  .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + i * barHeight +")"; });

bar2.append("rect")
    .attr("width", x2)
    .attr("height", barHeight - 60);

</script>

最佳答案

编辑:明白了。您在 3 个位置遗漏了第二组变量的名称:

1.

var Chart2 = d3.select(".chart")(应为chart2)

2.

.attr("height", barHeight * data.length); (应为 data2)

3.

var bar2 = Chart.selectAll("g")(应为chart2)

将留下我对下面的放置所做的事情。请注意 chart 上的 position:absolute 以使 chart2 与其重叠。

您的代码有几个问题,我只是复制了有效的部分并对数据进行了更改。我将尝试找到您代码中的所有问题并编辑我的答案。

目前,这是一个可行的解决方案。我认为导致问题的原因是一些命名困惑,所以我只是覆盖两个图表的相同变量。一旦添加了 svg 元素,您就不需要保留变量了。

var data = [4, 8, 15, 16, 23, 42];


var width = 420,
    barHeight = 80;

var x = d3.scale.linear()
    .domain([0, d3.max(data)])
    .range([0, width]);


var chart = d3.select(".chart")
    .attr("width", width)
    .attr("height", barHeight * data.length);


var bar = chart.selectAll("g")
    .data(data)
    .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + i * barHeight +")"; });

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 60);

var data = [10, 10, 10, 10, 10, 10];


var width = 420,
    barHeight = 80;

var chart = d3.select(".chart2")
    .attr("width", width)
    .attr("height", barHeight * data.length);


var bar = chart.selectAll("g")
    .data(data)
    .enter().append("g")
    .attr("transform", function(d, i) { return "translate(0," + (i * barHeight + barHeight - 60 )  +")"; });

bar.append("rect")
    .attr("width", x)
    .attr("height", barHeight - 60);

http://jsfiddle.net/x8rax/6/

关于javascript - D3.js分组条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889019/

相关文章:

javascript - D3数据绑定(bind)(二维数组)

javascript - D3 过渡线发生两次

javascript - &lt;iframe&gt; 中的欺骗导航器

javascript - Google recaptcha 无法与 AngularJS 一起使用

javascript - 词云中缺少 d3.js 词

angular - 从 Material Icon Registry 加载图标时出现 "<svg> tag not found"错误

javascript - JavaScript 中的特殊字符无法在网站上正确显示

javascript - 使用 JavaScript 动态应用 CSS

javascript - 更新过渡中的轴样式

javascript - 使用 d3.js 单击圆圈来显示工具提示