d3 bar Graph错误说xscale.bandwidth()不是函数

发布于 2025-01-29 04:28:36 字数 2935 浏览 4 评论 0原文

谁能告诉我我做错了什么?我有一个错误。

undured(在承诺中)typeerror:xscale.bandwidth不是函数 在Barchart(bar_chart.js:53:27) 在bar_chart.js:84:5

我试图创建此数据的条形图。

year,total_ghg
2000,661.97
2001,665.72
2002,660.75
2003,583.65
2004,635.5
2005,598.44
2006,646.91
2007,646.46
2008,617.09
2009,633.8
2010,601.14
2011,644.74
2012,643.12
2013,555.26
2014,566.21
2015,566.47
2016,577.32
2017,623.08
2018,619.26 

我的JS

var dataset;

function barChart(dataset) {
  //declaring Varibales
var margin = {top:50, right:50, bottom:50, left:50};
  var width = 500-margin.left-margin.right;
  var height = 500-margin.top-margin.bottom;

//creating svg
  var svg = d3
    .select("#barchart")
    .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 + ")");

//setting up scales
var xScale = d3
  .scaleTime()
  .domain([
    d3.min(dataset, function (d) {
      return d.year;
    }),
    d3.max(dataset, function (d) {
      return d.year;
    }),
  ])
.range([0,width]);

var yScale = d3.scaleLinear()
.domain([0,d3.max(dataset, function (d) {
    return d.total_ghg;
  })
])
.range([height,0]);

// Plotting axis

svg.append("g").attr("transform", "translate(0," + height + ")").call(d3.axisBottom(xScale));
svg.append("g").call(d3.axisLeft(yScale));

  //Set up groups
  svg.selectAll("mybar")
  .enter()
  .data(dataset).append("rect")
    .attr("x", function(d) {
      return xScale(d.year);
    })
    .attr('y', function(d) {
      return yScale(d.total_ghg);
    })
    .attr("width", xScale.rangeBand())
    .attr('height', function(d) {
      return height - yScale(d.total_ghg);
    })
    .attr("fill", "#004DA5")
    .on("mouseover", function(event, d) {
      d3.select(this).attr("fill", "orange");
      var xPosition = parseFloat(d3.select(this).attr("x")) + xScale.bandwidth() / 2 - 5;
      var yPosition = parseFloat(d3.select(this).attr("y")) + 20;
      svg.append("text")
        .attr("id", "tooltip")
        .attr("x", xPosition)
        .attr("y", yPosition)
        .text(d);
    }).on("mouseout", function(d) {
      d3.select("#tooltip").remove();
      d3.select(this)
        .attr("fill", "#004DA5")
    });

}

function init() {
  d3.csv("src/data/total_ghp.csv", function (d) {
    // + : force the year and month to be typed as a number instead of string
    return {
      year: d3.timeParse("%Y")(d.year),
      total_ghg: +d.total_ghg,
    };
  }).then(function (data) {
    dataset = data;
    barChart(dataset);
  });
}

window.addEventListener("load", init);

任何建议请

我尝试过的东西,

ScaleOrdinal
rangeBandRounds
RangeBand()

而不是带宽 还有更多的事情,例如在每种情况下都使用不同的D3脚本相同错误

Can anyone tell me what I am doing wrong? I am getting an error.

Uncaught (in promise) TypeError: xScale.bandwidth is not a function
at barChart (bar_chart.js:53:27)
at bar_chart.js:84:5

I am trying to create a bar graph of this data.

year,total_ghg
2000,661.97
2001,665.72
2002,660.75
2003,583.65
2004,635.5
2005,598.44
2006,646.91
2007,646.46
2008,617.09
2009,633.8
2010,601.14
2011,644.74
2012,643.12
2013,555.26
2014,566.21
2015,566.47
2016,577.32
2017,623.08
2018,619.26 

my js

var dataset;

function barChart(dataset) {
  //declaring Varibales
var margin = {top:50, right:50, bottom:50, left:50};
  var width = 500-margin.left-margin.right;
  var height = 500-margin.top-margin.bottom;

//creating svg
  var svg = d3
    .select("#barchart")
    .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 + ")");

//setting up scales
var xScale = d3
  .scaleTime()
  .domain([
    d3.min(dataset, function (d) {
      return d.year;
    }),
    d3.max(dataset, function (d) {
      return d.year;
    }),
  ])
.range([0,width]);

var yScale = d3.scaleLinear()
.domain([0,d3.max(dataset, function (d) {
    return d.total_ghg;
  })
])
.range([height,0]);

// Plotting axis

svg.append("g").attr("transform", "translate(0," + height + ")").call(d3.axisBottom(xScale));
svg.append("g").call(d3.axisLeft(yScale));

  //Set up groups
  svg.selectAll("mybar")
  .enter()
  .data(dataset).append("rect")
    .attr("x", function(d) {
      return xScale(d.year);
    })
    .attr('y', function(d) {
      return yScale(d.total_ghg);
    })
    .attr("width", xScale.rangeBand())
    .attr('height', function(d) {
      return height - yScale(d.total_ghg);
    })
    .attr("fill", "#004DA5")
    .on("mouseover", function(event, d) {
      d3.select(this).attr("fill", "orange");
      var xPosition = parseFloat(d3.select(this).attr("x")) + xScale.bandwidth() / 2 - 5;
      var yPosition = parseFloat(d3.select(this).attr("y")) + 20;
      svg.append("text")
        .attr("id", "tooltip")
        .attr("x", xPosition)
        .attr("y", yPosition)
        .text(d);
    }).on("mouseout", function(d) {
      d3.select("#tooltip").remove();
      d3.select(this)
        .attr("fill", "#004DA5")
    });

}

function init() {
  d3.csv("src/data/total_ghp.csv", function (d) {
    // + : force the year and month to be typed as a number instead of string
    return {
      year: d3.timeParse("%Y")(d.year),
      total_ghg: +d.total_ghg,
    };
  }).then(function (data) {
    dataset = data;
    barChart(dataset);
  });
}

window.addEventListener("load", init);

Any suggestions Please

What I have tried

ScaleOrdinal
rangeBandRounds
RangeBand()

instead of bandwidth
and a few more things like using a different d3 script same error in every scenario

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

画中仙 2025-02-05 04:28:36

您的XScale使用scaletime,这是针对轴代表时间(即线图)的图表的。对于条形图,您应该使用scaleband,它确实具有bandwidth函数:

const xScale = d3
  .scaleBand()
  .domain([
    d3.min(dataset, (d) => d.year),
    d3.max(dataset, (d) = > d.year),
  ])
  .range([0, width]);

可以在此处找到有关scaleband的更多信息: https://observablehq.com/@d3/d3/d3/d3/d3-scaleband

您的代码中还有其他一些错误,可以防止您的条形渲染:

  1. 用xscale xscale xscale
  2. xscale x scalband替换scaletime。 rangeband()with xscale.bandwidth()
  3. move .enter()以.data(dataset)为之后

Your xScale uses scaleTime, which is meant for charts where the axis represents time (i.e. line charts). For bar charts you should use scaleBand instead which does have the bandwidth function:

const xScale = d3
  .scaleBand()
  .domain([
    d3.min(dataset, (d) => d.year),
    d3.max(dataset, (d) = > d.year),
  ])
  .range([0, width]);

More information on scaleBand can be found here: https://observablehq.com/@d3/d3-scaleband

There are some other mistakes in your code that prevent your bars from rendering:

  1. Replace scaleTime with scaleBand for xScale
  2. Replace xScale.rangeBand() with xScale.bandwidth()
  3. Move .enter() to come after .data(dataset)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文