未捕获的TypeError:xScale.rangeBand不是d3.js中的函数 [英] Uncaught TypeError: xScale.rangeBand is not a function in d3.js

查看:259
本文介绍了未捕获的TypeError:xScale.rangeBand不是d3.js中的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试按照 Vegibit的教程生成条形图"https://jsfiddle.net/xameeramir/499q0un9/>我的小提琴.

Trying to generate bar chart by following Vegibit's tutorial in my fiddle.

d3.min.js参考效果很好.

但是,当我尝试通过以下方式实现下载的本地副本时:

However when I try to implement downloaded local copy by using:

<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>

它引发以下错误:

未捕获的TypeError:xScale.rangeBand不是函数

Uncaught TypeError: xScale.rangeBand is not a function

推荐答案

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

Here is your fiddle, updated to D3 version 4.x: https://jsfiddle.net/jnxh140f/

主要更改:

要使用带有stylesattrs的对象(不是styleattr),必须引用D3-selection-multi:

For using objects with styles and attrs (not style and attr), you have to reference D3-selection-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)

加上其他小的更改(检查代码).

Plus other small changes (check the code).

这篇关于未捕获的TypeError:xScale.rangeBand不是d3.js中的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆