未捕获的类型错误:xScale.rangeBand不是d3.js中的函数

Uncaught TypeError: xScale.rangeBand is not a function in d3.js

本文关键字:d3 不是 js rangeBand 函数 类型 错误 xScale      更新时间:2023-09-26

按照Vegipt的教程生成条形图。

d3.min.js参考效果良好。

然而,当我尝试使用实现下载的本地副本时

<script type="text/javascript" src="~/Scripts/d3/d3.min.js"></script>

路径由Visual Studio的ASP.NET项目工具自动生成

    d3BarChart({
      element: '#bar-chart',
      dataSource: [10, 20, 220, 240, 270, 300, 330, 370, 410, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120,
          135, 150, 165, 180, 200],
    });
    function d3BarChart(chartConfig) {
      var dataSource = chartConfig.dataSource;
      var margin = { top: 30, right: 10, bottom: 30, left: 50 };
      var height = 400 - margin.top - margin.bottom,
          width = 720 - margin.left - margin.right,
          barWidth = 30,
          barOffset = 10;
      var dynamicColor;
      var yScale = d3.scaleLinear()
          .domain([0, d3.max(chartConfig.dataSource)])
          .range([0, height])
      var xScale = d3.scaleBand()
          .domain(d3.range(0, chartConfig.dataSource.length))
          .range([0, width])
      var colors = d3.scaleLinear()
          .domain([0, chartConfig.dataSource.length])
          .range(['red', 'green'])
      var awesome = d3.select(chartConfig.element).append('svg')
          .attr('width', width + margin.left + margin.right)
          .attr('height', height + margin.top + margin.bottom)
          .append('g')
          .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
          .selectAll('rect').data(chartConfig.dataSource)
          .enter().append('rect')
          .style({
            'fill': function (data, i) {
              return colors(i);
            }, 'stroke': '#31708f', 'stroke-width': '5'
          })
          .attr('width', xScale.rangeBand())
          .attr('x', function (data, i) {
            return xScale(i);
          })
          .attr('height', 0)
          .attr('y', height)
          .on('mouseover', function (data) {
            dynamicColor = this.style.fill;
            d3.select(this)
                .style('fill', 'brown')
          })
          .on('mouseout', function (data) {
            d3.select(this)
                .style('fill', dynamicColor)
          })
      awesome.transition()
          .attr('height', function (data) {
            return yScale(data);
          })
          .attr('y', function (data) {
            return height - yScale(data);
          })
          .delay(function (data, i) {
            return i * 20;
          })
          .duration(2000)
          .ease('elastic')
      var verticalGuideScale = d3.scale.linear()
          .domain([0, d3.max(chartConfig.dataSource)])
          .range([height, 0])
      var vAxis = d3.svg.axis()
          .scale(verticalGuideScale)
          .orient('left')
          .ticks(10)
      var verticalGuide = d3.select('svg').append('g')
      vAxis(verticalGuide)
      verticalGuide.attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
      verticalGuide.selectAll('path')
          .style({ fill: 'none', stroke: "#3c763d" })
      verticalGuide.selectAll('line')
          .style({ stroke: "#3c763d" })
      var hAxis = d3.svg.axis()
          .scale(xScale)
          .orient('bottom')
          .ticks(chartConfig.dataSource.size)
      var horizontalGuide = d3.select('svg').append('g')
      hAxis(horizontalGuide)
      horizontalGuide.attr('transform', 'translate(' + margin.left + ', ' + (height + margin.top) + ')')
      horizontalGuide.selectAll('path')
          .style({ fill: 'none', stroke: "#3c763d" })
      horizontalGuide.selectAll('line')
          .style({ stroke: "#3c763d" });
    }
    <div id="bar-chart"></div>

它抛出以下错误:

未捕获类型错误:xScale.rangeBand不是函数

这是你的小提琴,更新到D3 4.x版本:https://jsfiddle.net/jnxh140f/

主要变化:

要使用具有stylesattrs(而不是styleattr)的对象,必须参考D3选择multi:

<script src="https://d3js.org/d3-selection-multi.v1.min.js"></script>

对于天平:

var yScale = d3.scaleLinear()
    .domain([0, d3.max(chartdata)])
    .range([0, height])
var xScale = d3.scaleBand()
    .domain(d3.range(0, chartdata.length))
    .range([0, width])

宽度:

.attr('width', xScale.bandwidth())

对于轴:

var vAxis = d3.axisLeft(verticalGuideScale)
    .ticks(10)
var hAxis = d3.axisBottom(xScale)
    .ticks(chartdata.size)

缓解:

.ease(d3.easeElastic)

再加上其他小改动(检查代码)。