【问题标题】:c3js position of data labels数据标签的c3js位置
【发布时间】:2014-11-26 18:13:44
【问题描述】:

有没有办法改变c3条形图中数据上方的标签位置? 在官方文档中很好地解释了如何通过操纵 y 和 x 整数来更改 x 和 y 测量轴上的标签位置,但我没有找到任何数据标签。

我试图用简单的d3 指向它,c3 是基于它,但console.log 返回 null:

d3.selectAll(".c3-texts .c3-text").each(function () {
    var yOrigin = d3.select(this).attr('y');
    console.log(yOrigin);
})

因为它在图形生成之前触发。您可以在此处查看和编辑我正在处理的内容:

var chart = c3.generate({
  data: {
    columns: [
      ['de', 30],
      ['da', 20],
      ['db', 50],
    ],
    groups: [
      ['de', 'da', 'db']
    ],
    type: 'bar',
    labels: {
      format: {
        y: function(v, id) {
          return id;
        },
      }
    }
  },
  grid: {
    y: {
      lines: [{
        value: 0
      }]
    }
  }
});

d3.selectAll(".c3-texts .c3-text").each(function() {
  var yOrigin = d3.select(this).attr('y');
  console.log('yOrigin:' + yOrigin);
  //d3.select(this).attr('y',100);
})
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/c3/0.3.0/c3.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/c3/0.3.0/c3.css" rel="stylesheet" />
<div id="chart">
</div>

【问题讨论】:

  • 可以使用setTimeout延时运行代码:jsfiddle.net/e60o24d0/2
  • 是的,我最终设法使用 setTimeout 解决方法,无论如何谢谢

标签: javascript jquery d3.js c3.js


【解决方案1】:

您可以通过两种方式影响这些标签:

一个。在 CSS 中使用 transform

.c3-texts .c3-text text {
  transform: translate(-22px, 0);
}

b.在onrendered 回调中使用 D3 选择它们:

var chart = c3.generate({
    onrendered: () => {
        d3.selectAll('.c3-text').each((v) => {
            console.dir(v);
        });
    },
    data: {
        columns: [
            ['data1', 30, -200, -100, 400, 150, 250],
            ['data2', -50, 150, -150, 150, -50, -150],
            ['data3', -100, 100, -40, 100, -150, -50]
        ],
        groups: [
            ['data1', 'data2']
        ],
        type: 'bar',
        labels: true
    },
    grid: {
        y: {
            lines: [{value: 0}]
        }
    }
});

这比使用 setTimeout 更好,因为您不必随意猜测渲染标签需要多长时间才能使用 D3 选择它们。

var chart = c3.generate({
  onrendered: () => {
    d3.selectAll('.c3-text').each((v) => {
      console.dir(v);
    });
  },
  data: {
    columns: [
      ['data1', 30, -200, -100, 400, 150, 250],
      ['data2', -50, 150, -150, 150, -50, -150],
      ['data3', -100, 100, -40, 100, -150, -50]
    ],
    groups: [
      ['data1', 'data2']
    ],
    type: 'bar',
    labels: true
  },
  grid: {
    y: {
      lines: [{
        value: 0
      }]
    }
  }
});
.c3-texts .c3-text text {
  transform: translate(-22px, 0);
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/c3/0.3.0/c3.min.js"></script>
<link href="http://cdnjs.cloudflare.com/ajax/libs/c3/0.3.0/c3.css" rel="stylesheet" />

<div id="chart">
</div>

【讨论】:

  • 谁能解释一下答案?选择(使用 d3)元素并且什么都不做是什么意思?如何通过在 javascript 中而不是在 CSS 中应用变换来移动这些元素(SVG 元素?)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多