D3js,动态改变X轴的域
D3js, dynamically change the domain of X-axis
我正在处理的当前项目有这个条形图,它有 x 轴和 y 轴。问题是,如果 X 轴的域从一开始就被初始化为从 0 到 10,即使我的数据长于 10,条形图也会覆盖图表的整个宽度。
如果我有较小的数据并且域设置为 10(这比我现在拥有的数据高得多),这是示例。
如果我的数据高于我在后端设置的域,下面是图表:
它将离开 X 轴并且域仍然相同...
我的问题是:有什么方法可以将 x 轴的域初始化为我的数据的最大值或至少高于预期数据。
因为我的数据是动态的,我永远不知道会有多少数据,所以如果我丢失了一些数据或不显示它们的真实数字,那将是一个大问题。
这也是我截取的代码:
var margin = { top: 5, right: 25, bottom: 25, left: 125 },
width3 = 440 - margin.left - margin.right,
height3 = 150 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg3 = d3
.select('#graphic2')
.append('svg')
.attr('width', width3 + margin.left + margin.right)
.attr('height', height3 + margin.top + margin.bottom)
.append('g')
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var data = [
{ name: 'a', Number: 1 },
{ name: 'b', Number: 2 },
{ name: 'c', Number: 3 },
{ name: 'd', Number: 4 },
{ name: 'e', Number: 5 },
{ name: 'f', Number: 3 },
{ name: 'g', Number: 2 },
{ name: 'h', Number: 4 },
];
// Add X axis
var x3 = d3.scaleLinear().domain([0, 4]).range([0, width3]);
svg3
.append('g')
.attr('transform', 'translate(0,' + height3 + ')')
.call(d3.axisBottom(x3))
.selectAll('text')
.style('text-anchor', 'end');
// Y axis
var y3 = d3
.scaleBand()
.range([0, height3])
.domain(
data.map(function (d) {
return d.name;
})
)
.padding(0.1);
svg3.append('g').call(d3.axisLeft(y3));
//Bars
svg3
.selectAll('myRect')
.data(data)
.enter()
.append('rect')
.attr('x', 4)
.attr('y', function (d) {
return y3(d.name);
})
.attr('width', function (d) {
return x3(d.Number);
})
.attr('height', y3.bandwidth())
.attr('fill', function (d) {
if (d.Number < 45) {
return '#abd1e0';
} else if (d.Number > 45 && d.Number < 55) {
return '#76a1b3';
} else {
return '#33505c';
}
});
<script src="https://d3js.org/d3.v5.min.js"></script>
<div id="graphic2"></div>
你想要这个吗?
const numbers = data.map(d=>d.Number);
var x3 = d3.scaleLinear().domain(d3.extent(numbers))....
我正在处理的当前项目有这个条形图,它有 x 轴和 y 轴。问题是,如果 X 轴的域从一开始就被初始化为从 0 到 10,即使我的数据长于 10,条形图也会覆盖图表的整个宽度。 如果我有较小的数据并且域设置为 10(这比我现在拥有的数据高得多),这是示例。
如果我的数据高于我在后端设置的域,下面是图表:
它将离开 X 轴并且域仍然相同...
我的问题是:有什么方法可以将 x 轴的域初始化为我的数据的最大值或至少高于预期数据。 因为我的数据是动态的,我永远不知道会有多少数据,所以如果我丢失了一些数据或不显示它们的真实数字,那将是一个大问题。
这也是我截取的代码:
var margin = { top: 5, right: 25, bottom: 25, left: 125 },
width3 = 440 - margin.left - margin.right,
height3 = 150 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg3 = d3
.select('#graphic2')
.append('svg')
.attr('width', width3 + margin.left + margin.right)
.attr('height', height3 + margin.top + margin.bottom)
.append('g')
.attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
var data = [
{ name: 'a', Number: 1 },
{ name: 'b', Number: 2 },
{ name: 'c', Number: 3 },
{ name: 'd', Number: 4 },
{ name: 'e', Number: 5 },
{ name: 'f', Number: 3 },
{ name: 'g', Number: 2 },
{ name: 'h', Number: 4 },
];
// Add X axis
var x3 = d3.scaleLinear().domain([0, 4]).range([0, width3]);
svg3
.append('g')
.attr('transform', 'translate(0,' + height3 + ')')
.call(d3.axisBottom(x3))
.selectAll('text')
.style('text-anchor', 'end');
// Y axis
var y3 = d3
.scaleBand()
.range([0, height3])
.domain(
data.map(function (d) {
return d.name;
})
)
.padding(0.1);
svg3.append('g').call(d3.axisLeft(y3));
//Bars
svg3
.selectAll('myRect')
.data(data)
.enter()
.append('rect')
.attr('x', 4)
.attr('y', function (d) {
return y3(d.name);
})
.attr('width', function (d) {
return x3(d.Number);
})
.attr('height', y3.bandwidth())
.attr('fill', function (d) {
if (d.Number < 45) {
return '#abd1e0';
} else if (d.Number > 45 && d.Number < 55) {
return '#76a1b3';
} else {
return '#33505c';
}
});
<script src="https://d3js.org/d3.v5.min.js"></script>
<div id="graphic2"></div>
你想要这个吗?
const numbers = data.map(d=>d.Number);
var x3 = d3.scaleLinear().domain(d3.extent(numbers))....