首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用d3.js图编写图

如何使用d3.js图编写图
EN

Stack Overflow用户
提问于 2021-05-23 21:00:53
回答 1查看 46关注 0票数 0

我想通过一个按钮从一个网站的表单中从DB mysql中提取一些数据,并使用d3.js在画布上制作图形,有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 01:00:38

您可以从JSON、CSV和文本文件加载数据。

例如,要加载JSON文件,可以使用d3.json(),如下所示。

代码语言:javascript
复制
d3.json('data.json', function(data) {
    console.log(data);
});

同样,您也可以从CSV文件中解析数据。D3函数d3.csv()接受文件名作为输入,处理该文件并将数据加载到对象数组中。请注意,不会打印csv文件的第一行。这是因为第一行被视为列名,其余行被视为数据。d3加载的数据对象使用这些列名作为对象的属性,因此被转换为对象键。

代码语言:javascript
复制
d3.csv('data.csv', function(data) {
    console.log(data);
});

从外部源加载数据时,D3返回一个名为error的参数。您可以使用此参数检查您的数据是否已成功加载。

代码语言:javascript
复制
d3.json('data.json', function(error, data) {
    if (error) {
        return console.warn(error);
    }

 // Manage the data

});

如果在加载数据时出现错误,就说数据格式不正确;D3将返回一个error对象。您可以检查错误并在此基础上做出决定。

这里有一个使用函数d3.csv()的示例

代码语言:javascript
复制
let svg = d3.select('svg');
let margin = 200,
  width = svg.attr('width') - margin,
  height = svg.attr('height') - margin;

svg.append('text')
  .attr('transform', 'translate(100,0)')
  .attr('x', 50).attr('y', 50)
  .attr('font-size', '20px')
  .attr('class', 'title')
  .text('Population bar chart');

let x = d3.scaleBand().range([0, width]).padding(0.4);
let y = d3.scaleLinear().range([height, 0]);

let g = svg.append('g').attr('transform', 'translate(' + 100 + ',' + 100 + ')');

 d3.csv('https://gist.githubusercontent.com/teocci/c0effdc5851bc7a07375106f1d9f4772/raw/1a22006fd5c8747dedee88e9f4980ea4155f9ba3/data.csv', function(error, data) {
  if (error) {
    throw error;
  }

  x.domain(data.map(function(d) {
    return d.year;
  }));
  y.domain([0, d3.max(data, function(d) {
    return d.population;
  })]);

  g.append('g')
    .attr('transform', 'translate(0,' + height + ')')
    .call(d3.axisBottom(x))
    .append('text')
    .attr('y', height - 250)
    .attr('x', width - 125)
    .attr('text-anchor', 'end')
    .attr('font-size', '18px')
    .attr('stroke', 'blue')
    .style('fill', 'blue')
    .text('year');

  g.append('g')
    .append('text')
    .attr('transform', 'rotate(-90)')
    .attr('y', 6)
    .attr('dy', '-50px')
    .attr('dx', '-100px')
    .attr('text-anchor', 'end')
    .attr('font-size', '18px')
    .attr('stroke', 'blue')
    .style('fill', 'blue')
    .text('population');

  g.append('g')
    .attr('transform', 'translate(0, 0)')
    .call(d3.axisLeft(y))

  g.selectAll('.bar')
    .data(data)
    .enter()
    .append('rect')
    .attr('class', 'bar')
    .on('mouseover', onMouseOver)
    .on('mouseout', onMouseOut)
    .attr('x', function(d) {
      return x(d.year);
    })
    .attr('y', function(d) {
      return y(d.population);
    })
    .attr('width', x.bandwidth()).transition()
    .ease(d3.easeLinear).duration(200)
    .delay(function(d, i) {
      return i * 25;
    })

    .attr('height', function(d) {
      return height - y(d.population);
    });
});


function onMouseOver(d, i) {
  d3.select(this)
    .attr('class', 'highlight');

  d3.select(this)
    .transition()
    .duration(200)
    .attr('width', x.bandwidth() + 5)
    .attr('y', function(d) {
      return y(d.population) - 10;
    })
    .attr('height', function(d) {
      return height - y(d.population) + 10;
    });

  g.append('text')
    .attr('class', 'val')
    .attr('x', function() {
      return x(d.year);
    })

    .attr('y', function() {
      return y(d.value) - 10;
    })
}

function onMouseOut(d, i) {
  d3.select(this)
    .attr('class', 'bar');

  d3.select(this)
    .transition()
    .duration(200)
    .attr('width', x.bandwidth())
    .attr('y', function(d) {
      return y(d.population);
    })
    .attr('height', function(d) {
      return height - y(d.population);
    });

  d3.selectAll('.val')
    .remove()
}
代码语言:javascript
复制
.bar {
  fill: green;
}

.highlight {
  fill: red;
}

.title {
  fill: blue;
  font-weight: bold;
}
代码语言:javascript
复制
<svg width="500" height="500"></svg>

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.13.0/d3.min.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67660033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档