D3JS V6:多线组

问题描述

我一直在尝试使用 D3JS V6 制作多线图。问题在于对数据进行分组(长格式)并尝试为每个组绘制路径。

我的数据遵循以下结构:

性爱 阿诺 D
2000 25
2001 58
2000 55
2001 75
总计 2000 80
总计 2001 133
    function dataviz2() {

    var dataset;
    h = 400
    w = 650
    padding = 40
    count = 0

    // Convertir Strings a Fechas
    var parseTime = d3.timeParse('%Y')

    // Convertir Fechas a Strings
    var parseDate = d3.timeFormat('%Y')

    var rowConverter = function (d) {
        return {
            Sexo: d.Sexo,Año: parseTime(d.Año),N: parseInt(d.N),}
    }

    d3.csv('data.csv',rowConverter).then(function (data) {
        dataset = data
        dataset.sort(function (x,y) {
            return d3.ascending(x.Año,y.Año)
        })
        dataBySex = d3.group(data,d => d.Sexo)
        dataBySexGr = Array.from(dataBySex,([sexo,value]) => ({ sexo,value }))
        console.log(dataBySex)
        console.log(dataBySexGr)



        chart()
    })

    function chart() {

        // Scale X
        xScale = d3.scaleTime()
            .domain([
                d3.min(dataset,function (d) { return d.Año }),d3.max(dataset,function (d) { return d.Año })
            ])
            .range([padding,w - padding])

        // Scale Y
        yScale = d3.scaleLinear()
            .domain([0,function (d) { return d.N })])
            .range([h - padding,padding])

        // Create Axis
        var xAxis = d3.axisBottom(xScale)
        var yAxis = d3.axisLeft(yScale)

        var svg = d3.select('#dataviz1')
            .append('svg')
            .attr('width',w)
            .attr('height',h)

        let id = 0;
        const ids = function () {
            return "line-" + id++
        }

        var lines = svg.selectAll('.line')
            .data(dataBySexGr)
            .join('path')
            .attr("class",ids)
            **.attr('d',d => {
                return d3.line()
                    .x(d => x(d.Año))
                    .y(d => y(d.N))
            })**
            .attr('stroke','blue')
            .attr('stroke-width',3)
            .attr('fill','none')

        svg.append('g')
            .attr('class','axis')
            .attr('transform','translate(0,' + (h - padding) + ')')
            .attr('visibility','visible')
            .call(xAxis)

        svg.append('g')
            .attr('class','translate(' + padding + ',0)')
            .attr('visibility','visible')
            .call(yAxis)
    }
}

经过多次尝试,我知道 .attr('d',d => ...) 是问题所在。该函数的参数表示“'d' 已声明,但它的值从未被读取”。当我检查 HTML 时,我收到了我正在寻找的 3 个不同的路径,但没有值,是一个函数

enter image description here

我真的被困在这里,所以我很感激任何帮助。

谢谢!!

解决方法

d3.line 返回一个行生成器函数,您可以将该函数视为 d 属性。您需要传递数据并执行该函数以获取路径数据:

.attr('d',d => {
            return d3.line()
                .x(d => x(d.Año))
                .y(d => y(d.N))(d)
        })

或者,您可以事先定义行生成器并简单地使用 .attr('d',line):

const line = d3.line()
   .x(d => x(d.Año))
   .y(d => y(d.N))

selection.attr("d",line);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...