Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在dc.js中订购条形图标签(再次)_Javascript_D3.js_Bar Chart_Dc.js_Crossfilter - Fatal编程技术网

Javascript 在dc.js中订购条形图标签(再次)

Javascript 在dc.js中订购条形图标签(再次),javascript,d3.js,bar-chart,dc.js,crossfilter,Javascript,D3.js,Bar Chart,Dc.js,Crossfilter,我知道在这个特定的主题上有很多问题,但在我的案例中,似乎没有一个解决方案是有效的 这是我的数据: var theData = [{ "value": "190.79", "age_days": "22", "criteria": "FX" }, { "value": "18.43", "age_days": "22", "criteria": "FX" }, {...}] 我将数据放入桶中,如下所示: var getAge = (d) => { if ((d.

我知道在这个特定的主题上有很多问题,但在我的案例中,似乎没有一个解决方案是有效的

这是我的数据:

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);
然后我使用

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


如何按我希望的方式对条形图进行排序?

当elasticX为真或未设置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());
};

<> >我想我们可以考虑在<代码>排序< /COD>为NULL时不对域进行排序。 无论如何,一种解决方法是自己设置域:

.x(d3.scaleBand().domain(the_order))
您不需要为条形图对组进行排序。(对于折线图,组顺序必须与比例域一致,但对于条形图则无关紧要。)

对于域集,这也适用于:

.group(groups.age.valueSum)

我猜这个故事的寓意是自动生成图表很复杂。大多数情况下,人们确实希望对X域进行排序,但允许用户提供自己的排序的最佳方式是什么


我不会说这是最好的方法,但有一种方法可以让它发挥作用。

太好了!谢谢你的帮助。我在我的代码中留下了
.elasticX(true)
,尽管我正在传递域,所以他们相互取消了…哦,对了-它是elasticX或空的,不是和。我更正了我的答案。在你的小提琴中,它是空的,但是是的,elasticX也意味着比例域将被忽略。谢谢你指出这一点!
.group(groups.age.valueSum)