【问题标题】:D3js, dynamically change the domain of X-axisD3js,动态改变X轴的域
【发布时间】:2021-11-16 18:34:31
【问题描述】:

我正在处理的当前项目有这个条形图,它有 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>

【问题讨论】:

    标签: javascript d3.js data-visualization bar-chart


    【解决方案1】:

    你想要这个吗?

    const numbers = data.map(d=>d.Number);
    var x3 = d3.scaleLinear().domain(d3.extent(numbers))....
    

    【讨论】:

    • 是的。起初我认为这是错误的,因为我也忘记了添加范围。但现在看起来很完美,条形宽度与我的数据值同时变化!非常感谢。非常感谢。
    • 你错过了 var x2 = ~~ 中的 .range([0, width2])
    • 如果我希望它从 0 开始而不是从数据的最低值开始,我该怎么办,因为它会阻止它在图表上显示...
    • var x2 = d3.scaleLinear().domain([0, d3.max(numbers)]).range([0, width2])
    • 太棒了!如果再问一个问题不是太粗鲁,你能不能回答一下我所做的关于制作一个简单的文本来显示我数据库中的一行数据的问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多