【问题标题】:DC.js - Custom ordering of ordinal scale line chartDC.js - 序数比例折线图的自定义排序
【发布时间】:2020-03-15 00:27:06
【问题描述】:

请原谅我的英语。

我正在尝试创建具有序数刻度和刷子功能的折线图。由于这种方法,我成功地将刷牙设置为序数: https://dc-js.github.io/dc.js/examples/brush-ordinal.html 现在我需要设置 x 轴值的顺序。

我的数据是这样的:

    [{"id_commune":4,"datation":"-30/-20","effectif":0.09,"commune":"Frejus","lieu_dit":"Les Aiguieres","departement":"83","pays":"FR","longitude":6.73703399,"latitude":43.433152,"quantite":1,"id_datation":1},
        {"id_commune":4,"datation":"-20/-10","effectif":0.09,"commune":"Frejus","lieu_dit":"Les Aiguieres","departement":"83","pays":"FR","longitude":6.73703399,"latitude":43.433152,"quantite":1,"id_datation":2},
        {"id_commune":4,"datation":"-10/1","effectif":0.09,"commune":"Frejus","lieu_dit":"Les Aiguieres","departement":"83","pays":"FR","longitude":6.73703399,"latitude":43.433152,"quantite":1,"id_datation":3},
    {"id_commune":7,"datation":"20/30","effectif":0.33,"commune":"Nimes","lieu_dit":"Solignac","departement":"30","pays":"FR","longitude":4.36005399,"latitude":43.836699,"quantite":1,"id_datation":6},{"id_commune":6,"datation":"20\/30","effectif":0.6,"commune":"Muralto","lieu_dit":"Liverpool b","departement":"TI","pays":"CH","longitude":8.80560809,"latitude":46.1729618,"quantite":1,"id_datation":6},
{"id_commune":4,"datation":"20/30","effectif":0.09,"commune":"Frejus","lieu_dit":"Les Aiguieres","departement":"83","pays":"FR","longitude":6.73703399,"latitude":43.433152,"quantite":1,"id_datation":6},{"id_commune":1,"datation":"20/30","effectif":0.14,"commune":"Aislingen","lieu_dit":"NP","departement":"Lkr. Dillingen an der Donau BY","pays":"DE","longitude":10.4559987,"latitude":48.5065603,"quantite":1,"id_datation":6},]

我的交叉过滤器维度和组如下所示:

var ndx = crossfilter(records)
var graphDim = ndx.dimension(function(d) {return d.datation});
var graphGroup = graphDim.group().reduceSum(function(d) {return d.effectif;});

还有图表:

lineChart
            .width(950)
            .height(350)
            .margins({top: 10, right: 50, bottom: 35, left: 30})
            .dimension(graphDim)            
            .keyAccessor(function(kv) { return  graphGroup.ord2int(kv.key); })
            .group(graphGroup)
            .x(d3.scaleLinear().domain(linear_domain))
            .xAxisLabel("Chronologie")
            .yAxisLabel("Effectif")
            .brushOn(true)
            .renderArea(true)
            .renderHorizontalGridLines(true)
            .renderVerticalGridLines(true)
            .elasticY(true)
            .yAxis().ticks(4);

现在,我明白了:

我试图完成的结果是相同的图表,但 x 轴刻度值的顺序如下: "-30/-20 -20/-10 -10/1 ……”

任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 有关图表库的问题请使用 [dc.js] 标签。 [dc] 是一个古老的 Unix 桌面计算器。
  • 对不起,我不知道,下次我会更小心的!

标签: d3.js dc.js crossfilter


【解决方案1】:

欢迎来到 Stack Overflow。为了将来参考,如果您可以包含一个可重现的示例,例如 jsFiddle,它会有所帮助。

我理解你在做什么,因为我写了序号刷机示例,但你没有包含所有代码,所以其他人不会清楚。

这里是fiddle with complete code,下面是相关代码:

var graphDim = ndx.dimension(function(d) {return d.datation});
var graphGroup = graphDim.group().reduceSum(function(d) {return d.effectif;});        
graphGroup = ordinal_to_linear_group(sort_group(graphGroup, function(a, b) {
        return d3.descending(a.value, b.value);
    }));
    line = dc.lineChart('#line');
    var linear_domain = [-0.5, data.length - 0.5];
    line
        .width(950)
        .height(350)
        .margins({top: 10, right: 50, bottom: 35, left: 30})
        .dimension(graphDim)            
        .keyAccessor(function(kv) { return  graphGroup.ord2int(kv.key); })
        .group(graphGroup)
        .x(d3.scaleLinear().domain(linear_domain))
        .xAxisLabel("Chronologie")
        .yAxisLabel("Effectif")
        .brushOn(true)
        .renderArea(true)
        .renderHorizontalGridLines(true)
        .renderVerticalGridLines(true)
        .elasticY(true)

    line.yAxis().ticks(4);

    line.xAxis()
        .tickValues(d3.range(data.length))
        .tickFormat(function(d) { return graphGroup.int2ord(d); });

这是(坏的)结果:

顾名思义,sort_group() 创建了一个按排序函数排序的假组。现在它是按值排序,从高到低:

sort_group(graphGroup, function(a, b) {
        return d3.descending(a.value, b.value);
    })

您似乎想按每个键的第一部分的数值进行排序。您可以相应地更改排序:

sort_group(graphGroup, function(a, b) {
        return d3.ascending(+a.key.split('/')[0], +b.key.split('/')[0]);
    })

这会将每个键按/ 拆分,然后获取第一项 ([0]),然后将其转换为数字 (+),然后使用 d3.ascending 指定从低到高的排序。

结果:

还有a working version of the fiddle

【讨论】:

  • 非常感谢!!我开始绝望了!我可能会有更多关于这类问题的问题,但这个问题是我最糟糕的问题之一。
  • 太好了!当您收到适合您的答案时,请单击答案旁边的绿色复选标记以接受它。这会分发一些 Fake Internet Points™,并帮助人们跟踪哪些问题仍需要答案。
  • 看来我必须在 DC 和 SO 上都取得进展 :)
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多