在 dc.js 中订购条形图标签(再次)
Ordering a bar chart labels in dc.js (again)
我知道关于 SO 的特定主题有很多问题,但 none 的解决方案似乎适用于我的情况。
这是我的数据:
var theData = [{
"value": "190.79",
"age_days": "22",
"criteria": "FX"
}, {
"value": "18.43",
"age_days": "22",
"criteria": "FX"
}, {...}]
我这样将数据放入桶中:
var getAge = (d) => {
if ((d.age_days) <= 7) {
return (["1w", "2w", "1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 14) {
return (["2w", "1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 30) {
return (["1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 90) {
return (["3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 180) {
return (["6m", "1y", "All"]);
} else if ((d.age_days) <= 360) {
return (["1y", "All"]);
} else {
return (["All"]);
}
};
var ndx = crossfilter(theData);
var dims = {};
var groups = {};
dims.age = ndx.dimension(getAge,true);
groups.age = {};
groups.age.valueSum = dims.age.group().reduceSum((d) => d.value);
然后我尝试使用假组方法对组进行排序:
var sort_group = (source_group, order) => {
return {
all: () => {
let g = source_group.all();
let map = {};
g.forEach(function (kv) {
map[kv.key] = kv.value;
});
return order
.filter((k) => map.hasOwnProperty(k))
.map((k) => {
return {key: k, value: map[k]}
});
}
};
};
var the_order = ["1w", "2w", "1m", "3m", "6m", "1y", "All"];
var the_sorted_age_group = sort_group(groups.age.valueSum, the_order);
然后我使用
创建 barChart
theAgeChart
.height(200)
.width(400)
.dimension(dims.age)
.group(the_sorted_age_group)
.valueAccessor((d) => d.value)
.x(d3.scaleBand())
.xUnits(dc.units.ordinal);
但它仍然使用默认排序:
我创建了一个包含所有内容的 jsFiddle
here。
如何按照我希望的方式对条形进行排序?
当elasticX为true或者没有设置x尺度域时,坐标网格mixin会生成X域
if (_chart.elasticX() || _x.domain().length === 0) {
_x.domain(_chart._ordinalXDomain());
}
这完全有道理,但它在生成域时总是对域进行排序:
_chart._ordinalXDomain = function () {
var groups = _chart._computeOrderedGroups(_chart.data());
return groups.map(_chart.keyAccessor());
};
我想我们可以考虑在 ordering
为 null 时不对域进行排序。
无论如何,一种解决方法是自己设置域:
.x(d3.scaleBand().domain(the_order))
您不需要为条形图对组进行排序。 (对于折线图,组序必须与刻度域一致,但对于条形图则无所谓。)
设置域后,这也有效:
.group(groups.age.valueSum)
我想这个故事的寓意是自动生成图表很复杂。大多数时候确实希望对 X 域进行排序,但允许用户提供自己的排序的最佳方式是什么?
我不会说这是最好的方法,但有一种方法可以让它发挥作用。
我知道关于 SO 的特定主题有很多问题,但 none 的解决方案似乎适用于我的情况。
这是我的数据:
var theData = [{
"value": "190.79",
"age_days": "22",
"criteria": "FX"
}, {
"value": "18.43",
"age_days": "22",
"criteria": "FX"
}, {...}]
我这样将数据放入桶中:
var getAge = (d) => {
if ((d.age_days) <= 7) {
return (["1w", "2w", "1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 14) {
return (["2w", "1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 30) {
return (["1m", "3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 90) {
return (["3m", "6m", "1y", "All"]);
} else if ((d.age_days) <= 180) {
return (["6m", "1y", "All"]);
} else if ((d.age_days) <= 360) {
return (["1y", "All"]);
} else {
return (["All"]);
}
};
var ndx = crossfilter(theData);
var dims = {};
var groups = {};
dims.age = ndx.dimension(getAge,true);
groups.age = {};
groups.age.valueSum = dims.age.group().reduceSum((d) => d.value);
然后我尝试使用假组方法对组进行排序:
var sort_group = (source_group, order) => {
return {
all: () => {
let g = source_group.all();
let map = {};
g.forEach(function (kv) {
map[kv.key] = kv.value;
});
return order
.filter((k) => map.hasOwnProperty(k))
.map((k) => {
return {key: k, value: map[k]}
});
}
};
};
var the_order = ["1w", "2w", "1m", "3m", "6m", "1y", "All"];
var the_sorted_age_group = sort_group(groups.age.valueSum, the_order);
然后我使用
创建barChart
theAgeChart
.height(200)
.width(400)
.dimension(dims.age)
.group(the_sorted_age_group)
.valueAccessor((d) => d.value)
.x(d3.scaleBand())
.xUnits(dc.units.ordinal);
但它仍然使用默认排序:
我创建了一个包含所有内容的 jsFiddle
here。
如何按照我希望的方式对条形进行排序?
当elasticX为true或者没有设置x尺度域时,坐标网格mixin会生成X域
if (_chart.elasticX() || _x.domain().length === 0) {
_x.domain(_chart._ordinalXDomain());
}
这完全有道理,但它在生成域时总是对域进行排序:
_chart._ordinalXDomain = function () {
var groups = _chart._computeOrderedGroups(_chart.data());
return groups.map(_chart.keyAccessor());
};
我想我们可以考虑在 ordering
为 null 时不对域进行排序。
无论如何,一种解决方法是自己设置域:
.x(d3.scaleBand().domain(the_order))
您不需要为条形图对组进行排序。 (对于折线图,组序必须与刻度域一致,但对于条形图则无所谓。)
设置域后,这也有效:
.group(groups.age.valueSum)
我想这个故事的寓意是自动生成图表很复杂。大多数时候确实希望对 X 域进行排序,但允许用户提供自己的排序的最佳方式是什么?
我不会说这是最好的方法,但有一种方法可以让它发挥作用。