我的目标是使用示例数据在页面上显示条形图。我希望有一个x和y轴。
我遵循了有关如何创建D3.JS条形图的教程,该教程在添加x和y轴之前一直工作良好。我本来希望条形图适合轴的内部,但实际结果是条形图位于轴的外部。我在控制台中未收到任何错误消息。
我尝试重新定位代码,以便在轴前后都创建条形图,而没有任何乐趣。
var data = [80, 100, 56, 120, 180, 30, 40, 120, 160];
var svgWidth = 500,
svgHeight = 300,
barPadding = 5;
var barWidth = (svgWidth / data.length);
var svg = d3.select('svg')
.attr("width", svgWidth)
.attr("height", svgHeight);
var barChart = svg.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("y", function(d) {
return svgHeight - d
})
.attr("height", function(d) {
return d;
})
.attr("width", barWidth - barPadding)
.attr("transform", function(d, i) {
var translate = [barWidth * i, 0];
return "translate(" + translate + ")";
});
var xScale = d3.scaleLinear()
.domain([0, d3.max(data)])
.range([0, svgWidth]);
var yScale = d3.scaleLinear()
.domain([0, d3.max(data)])
.range([svgHeight, 0]);
var x_axis = d3.axisBottom().scale(xScale);
var y_axis = d3.axisLeft().scale(yScale);
svg.append("g")
.attr("transform", "translate(50, 10)")
.call(y_axis);
var xAxisTranslate = svgHeight - 20;
svg.append("g")
.attr("transform", "translate(50, " + xAxisTranslate + ")")
.call(x_axis);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg class="bar-chart"></svg>
我试图尽可能少地更改您的代码。
查看此示例以获取真正干净的方法:https : //bl.ocks.org/caravinden/d04238c4c9770020ff6867ee92c7dac1
var data = [80, 100, 56, 120, 180, 30, 40, 120, 160];
var svgWidth = 500,
svgHeight = 300,
barPadding = 10;
const margin = {
top: 20,
right: 20,
bottom: 30,
left: 50
};
var svg = d3.select('svg')
.attr("width", svgWidth)
.attr("height", svgHeight);
const width = +svg.attr("width") - margin.left - margin.right;
const height = +svg.attr("height") - margin.top - margin.bottom;
var barWidth = (width / data.length);
var barChartGroup = svg.append('g')
.attr("transform", `translate(${margin.left}, ${margin.top})`)
var xScale = d3.scaleBand()
.domain(data.map((d,i) => i))
.rangeRound([0, width])
.padding(barPadding);
var yScale = d3.scaleLinear()
.domain([0, d3.max(data)])
.range([height, 0]);
var x_axis = d3.axisBottom(xScale);
var y_axis = d3.axisLeft(yScale);
barChartGroup.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("y", function(d) {
return yScale(d);
})
.attr("x", function(d,i) {
return xScale(i) - (barWidth-barPadding)/2;
})
.attr("height", function(d) {
return height - yScale(d);
})
.attr("width", barWidth - barPadding) //xScale.bandwidth()
svg.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`)
.call(y_axis);
svg.append("g")
.attr("transform", `translate(${margin.left}, ${height + margin.top})`)
.call(x_axis);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg class="bar-chart"></svg>
输出:
对象数组示例:
var data = [
{val: 80, name:"A"},
{val: 100, name:"B"},
{val: 56, name:"C"},
{val: 120, name:"D"},
{val: 180, name:"E"},
{val: 30, name:"F"},
{val: 40, name:"G"},
{val: 120, name:"H"},
{val: 160, name:"I"}
];
var svgWidth = 500,
svgHeight = 300,
barPadding = 10;
const margin = {
top: 20,
right: 20,
bottom: 30,
left: 50
};
var svg = d3.select('svg')
.attr("width", svgWidth)
.attr("height", svgHeight);
const width = +svg.attr("width") - margin.left - margin.right;
const height = +svg.attr("height") - margin.top - margin.bottom;
var barWidth = (width / data.length);
var barChartGroup = svg.append('g')
.attr("transform", `translate(${margin.left}, ${margin.top})`)
var xScale = d3.scaleBand()
.domain(data.map((d,i) => d.name))
.rangeRound([0, width])
.padding(barPadding);
var yScale = d3.scaleLinear()
.domain([0, d3.max(data, d => d.val)])
.range([height, 0]);
var x_axis = d3.axisBottom(xScale);
var y_axis = d3.axisLeft(yScale);
barChartGroup.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("y", function(d) {
return yScale(d.val);
})
.attr("x", function(d,i) {
return xScale(d.name) - (barWidth - barPadding)/2; //barWidth - barPadding
})
.attr("height", function(d) {
return height - yScale(d.val);
})
.attr("width", barWidth - barPadding); //xScale.bandwidth()
svg.append("g")
.attr("transform", `translate(${margin.left}, ${margin.top})`)
.call(y_axis);
svg.append("g")
.attr("transform", `translate(${margin.left}, ${height + margin.top})`)
.call(x_axis);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg class="bar-chart"></svg>
输出:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句