Использование порядкового масштаба ('d3.scale.ordinal') для оси X на гистограмме
У меня есть массив данных, как это:
var data = [{"Alphabet_Type":"a"}, {"Alphabet_Type":"b"}, {"Alphabet_Type":"a"}];
Я использую:
- dc.js
- crossfilter.js
- d3.js
Я хочу создать гистограмму с:
- ось х, имеющая название алфавита, и
- ось Y имеет количество вхождений алфавита.
Вопрос: Как я могу построить гистограмму с порядковым масштабом по оси X?
Мой код:
var data = [{"Alphabet_Type":"a"}, {"Alphabet_Type":"b"}, {"Alphabet_Type":"a"}];
var Filter = crossfilter(data);
var Dimension = Filter.dimension(function (d) { return d.Alphabet_Type; });
var Group = Dimension.group();
dc.barChart("#bar-chart")
.width(800)
.height(275)
.transitionDuration(0)
.margins({ top: 10, right: 50, bottom: 30, left: 40 })
.dimension(Dimension)
.group(Group)
.elasticY(false)
.elasticX(false)
.x(d3.scale.linear().domain([-1, 10]))
.y(d3.scale.linear().domain([0, 5]))
.centerBar(true)
.renderHorizontalGridLines(true)
.renderVerticalGridLines(true)
.brushOn(false);
Наконец, у меня есть еще одна проблема, которая заключается в том, что Alphabet_Type
не будет иметь предсказуемых значений. Поэтому мне нужно получить значения для Alphabet_Type
через crossfilter.js и включить эти значения в домен. Как я могу это сделать?
2 ответа
Решение
Две вещи:
- Проходить
dc.units.ordinal
в качестве параметра для.xUnits()
, - Передать функцию порядкового масштаба
.x()
,
Вот что я имею в виду:
.x(d3.scale.ordinal().domain(["", "a", "b", "c"])) // Need empty val to offset first value
.xUnits(dc.units.ordinal) // Tell dc.js that we're using an ordinal x-axis
Смотрите это JSFiddle: http://jsfiddle.net/reblace/tbamW/156/
По какой-то причине я не мог получить renderHorizontalGridLines()
или же renderVerticalGridLines()
работать, но остальное хорошо.
Добавление
.x(d3.scale.ordinal().domain(data.map(function (d) {return d.Alphabet_Type; })))
решил проблему.