我正在制作一个使用D3.js这样的条形图bar chart http://www.statcan.gc.ca/pub/12-593-x/2007001/figures/figure2.gif 但它应该是垂直的。所以我可以通过两组数据显示比较。 我使用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>
答案 0 :(得分:1)
编辑:知道了。你在3个地方省略了第二组变量的名称:
1
var chart2 = d3.select(".chart")
(应为chart2
)
2
.attr("height", barHeight * data.length);
(应为data2
)
3
var bar2 = chart.selectAll("g")
(应为chart2
)
将保留下面放置的内容。请注意position:absolute
上的chart
以使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);