我有一个d3条形图,我从firebase中提取数据。我想将标签添加到x轴。这是我的条形图的代码:
new Firebase('https://exampl.firebaseIO.com/example').on('value', function (snapshot) {
var lst = [];
snapshot.forEach(function(childSnapshot) {lst.push(childSnapshot.val());});
var magValue = new crossfilter(lst).dimension(function (d) {return d.count;});
var magLabel = new crossfilter(lst).dimension(function (d) {return d.Owner;});
dc.barChart("#dc-magnitude-chart")
.width(480)
.height(150)
.margins({top: 10, right: 10, bottom: 20, left: 40})
.dimension(magValue) // the values across the x axis
.group(magValue.group().reduceSum(function(d) {return d.count;})) // the values on the y axis
.transitionDuration(500)
.centerBar(true)
.gap(56) // bar width Keep increasing to get right then back off.
.x(d3.scale.linear().domain([0.5, 7.5]))
.elasticY(true)
.xAxis().tickFormat(function(v) {return v;});
dc.renderAll();
});
magValue是出现的简单计数,它是x轴上的diplayd。我希望存储在magLabel变量中的名称显示在计数下方。感谢。
答案 0 :(得分:2)
供参考:在@bencripps回答的评论中,OP谈到使用xAxis.tickValues(['One','two','three','four','five','six','seven'])
。
tickValues
实际上是您要在您使用的比例范围内指定自定义刻度。现在,你正在使用线性比例:
.x(d3.scale.linear().domain([0.5, 7.5]))
所以它希望你的刻度值是那个可以绘制刻度的刻度上的点。如果你有更像xAxis.tickValues([1, 2, 3, 4, 5, 6, 7])
的东西,它应该有效。
然而,听起来你实际上并不想要线性比例。 d3还有其他比例类型,听起来你想要的是Ordinal Scale。序数尺度是您通常认为的条形图尺度;它们是一种具有离散域的比例。在这种情况下,您可以尝试将比例更改为:
.x(d3.scale.ordinal().domain(['One','two','three','four','five','six','seven']))
所以它使用了序数比例。由于您使用的是dc.js,因此您还需要指定
.xUnits(dc.units.ordinal)
以便它知道使用序号。
答案 1 :(得分:0)
这是一些添加X轴的简单代码;你将不得不摆弄域名,范围以获得所需的长度和刻度数。
var XaxisScale = d3.scale.linear()
.domain([0,150]) //you will have to set the domain, not sure what you want
.range([0, magValue.length)
var xAxis = d3.svg.axis()
.scale(XaxisScale)
.ticks( magValue.length ) // this you will need to set as well
var xAxisGroup = $('"#dc-magnitude-chart').append("g")
.attr('class', 'axis')
.attr('transform', 'translate(5,8)')
.call(xAxis);
注意,.call(xAxis)
实际上是将X轴附加到图表中。