Использование порядкового масштаба ('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 ответа

Решение

Две вещи:

  1. Проходить dc.units.ordinal в качестве параметра для .xUnits(),
  2. Передать функцию порядкового масштаба .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; })))

решил проблему.

Другие вопросы по тегам