使用外部数据的D3条形图

时间:2017-03-15 11:34:37

标签: javascript jquery d3.js svg

我使用d3.js v4创建了一个条形图,我试图使用外部数据文件(.tsv)文件,它给我以下错误:错误:属性高度:预期长度,“NaN”。 (匿名)@ d3.min.js:2 o @ d3.min.js:2 yn @ d3.min.js:2 mn @ d3.min.js:2 d3.min.js:2错误:属性y:预计长度,“NaN”。

这是我的代码:

<!DOCTYPE html>
<html>

<head>
    <title>Line Chart</title>
    <meta charset="8-UTF">
    <link rel="stylesheet" src="css/style.css"> </head>

<body>
    <div class="container">
        <h2>Bar Chart</h2>
       <div id="chart"></div>
    </div>
    <script src="js/d3.min.js"></script>
    <script src="js/main.js"></script>
</body>

</html>
ClipboardManager clipBoard = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
clipBoard.addPrimaryClipChangedListener(new OnPrimaryClipChangedListener() {

    @Override
    public void onPrimaryClipChanged() {
        ClipData clipData = clipBoard.getPrimaryClip();
        ClipData.Item item = clipData.getItemAt(0);
        String text = item.getText().toString();

        // Access your context here using YourActivityName.this
    }
});

这是我的data.tsv 值 23 22 24 23 27 26 30

1 个答案:

答案 0 :(得分:1)

问题在于:

var myChart = d3.select('#chart').append('svg')
    .style('background', '#E7E0CB')
    .attr('width', width + margin.right + margin.left)
    .attr('height', height + margin.top + margin.bottom)
    .append('g')
    .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
    .style('background', '#C9D7D6')
    .selectAll('rect').data(bardata)
    .enter().append('rect')
    .style('fill', '#C61C6F')
    .attr('width', xScale.bandwidth())

在一个变量中,您是:

  1. 附加SVG
  2. 追加小组
  3. 创建输入选择
  4. 附加矩形
  5. 而不是那样,让我们​​打破这个变量:

    var myChart = d3.select('body').append('svg')
        .style('background', '#E7E0CB')
        .attr('width', width + margin.right + margin.left)
        .attr('height', height + margin.top + margin.bottom)
        .append('g')
        .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
        .style('background', '#C9D7D6');
    
    var rects = myChart.selectAll('rect').data(bardata)
        .enter().append('rect')
        .style('fill', '#C61C6F')
        .attr('width', xScale.bandwidth())
        .attr('x', function(d, i) {
            return xScale(i);
        })
        .attr('height', 0)
        .attr('y', height)
    

    然后,您仅在rects上调用转换。

    除此之外,请注意由columns自动创建的d3.tsv属性:

    for (key in data) {
        if (key != "columns") bardata.push(data[key].value)
    }
    

    这是您的工作代码:

    &#13;
    &#13;
    var bardata = [];
    
    var data = d3.tsvParse(d3.select("#tsv").text());
    
    for (key in data) {
      if (key != "columns") bardata.push(data[key].value)
    }
    
    var margin = {
      top: 30,
      right: 30,
      bottom: 40,
      left: 50
    }
    
    var height = 400 - margin.top - margin.bottom,
      width = 400 - margin.left - margin.right,
      barWidth = 50,
      barOffset = 5;
    var tempColor;
    
    var yScale = d3.scaleLinear()
      .domain([0, d3.max(bardata)])
      .range([0, height]);
    
    var xScale = d3.scaleBand()
      .domain(d3.range(0, bardata.length))
      .padding(0.1)
      .range([0, width]);
    
    var tooltip = d3.select('body').append('div')
      .style('position', 'absolute')
      .style('padding', '0 10px')
      .style('background', 'white')
      .style('opacity', 0)
    
    var myChart = d3.select('body').append('svg')
      .style('background', '#E7E0CB')
      .attr('width', width + margin.right + margin.left)
      .attr('height', height + margin.top + margin.bottom)
      .append('g')
      .attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
      .style('background', '#C9D7D6');
    
    var rects = myChart.selectAll('rect').data(bardata)
      .enter().append('rect')
      .style('fill', '#C61C6F')
      .attr('width', xScale.bandwidth())
      .attr('x', function(d, i) {
        return xScale(i);
      })
      .attr('height', 0)
      .attr('y', height)
    
    .on('mouseover', function(d) {
        d3.select(this)
          .style('opacity', 0.5)
      })
      .on('mouseleave', function(d) {
        d3.select(this)
          .style('opacity', 1)
      })
      .on('mouseover', function(d) {
        tooltip.transition()
          .style('opacity', 0.9)
        tooltip.html(d)
          .style('left', (d3.event.pageX - 35) + 'px')
          .style('top', (d3.event.pageY - 30) + 'px')
    
        tempColor = this.style.fill;
        d3.select(this)
          .style('opacity', 0.5)
          .style('fill', 'yellow')
      })
      .on('mouseleave', function(d) {
        tempColor = this.style.fill;
        d3.select(this)
          .style('opacity', 1)
          .style('fill', '#C61C6F')
      })
    
    rects.transition()
      .attr('height', function(d) {
        return yScale(d);
      })
      .attr('y', function(d) {
        return height - yScale(d);
      })
      .delay(function(d, i) {
        return i * 20;
      })
      .duration(1000)
      .ease(d3.easeElastic)
    
    var vGuideScale = d3.scaleLinear()
      .domain([0, d3.max(bardata)])
      .range([0, height]);
    
    var vAxis = d3.axisLeft(vGuideScale).ticks(10)
    
    var vGuide = d3.select('svg').append('g')
    vAxis(vGuide)
    
    vGuide.attr('transform', 'translate(' + margin.left + ', ' + margin.top + ')')
    
    var hAxis = d3.axisBottom(xScale).tickValues(xScale.domain().filter(function(d, i) {
      return !(i % (bardata.length / 5))
    }))
    
    var hGuide = d3.select('svg').append('g')
    hAxis(hGuide)
    
    hGuide.attr('transform', 'translate(' + margin.left + ', ' + (height + margin.top) + ')');
    &#13;
    pre {
      display: none;
    }
    &#13;
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <pre id="tsv">value
    23
    22
    24
    23
    27
    26
    30
    </pre>
    &#13;
    &#13;
    &#13;