Не получается прорисовать линии на мультилинейном графике в d3.js

Начал изучать бибилиотеку d3.js в React и решил для начала построить мультилинейный график стремя линиями sales, revenue и profit, но столкнулся с проблемой:

Строю по данным в массиве salesData. Оси X и Y по данным sales и date отрисовал, но никак не могу понять почему не получается отрисовать три линии.

В консоли появляется только тег

Не добавляется атрибут d с координатами и не могу понять почему и что я не так делаю. Буду очень признателен, если подскажете что я упускаю.

import React, { useEffect, useRef } from 'react';
import * as d3 from 'd3';

const AxisLeft = () => {

    const salesData = [
        { reportDate: "2022-01-01", sales: 1000, revenue: 50000, profit: 20000 },
        { reportDate: "2022-02-01", sales: 1200, revenue: 60000, profit: 25000 },
        { reportDate: "2022-03-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-04-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-05-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-06-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-07-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-08-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-09-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-10-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-11-01", sales: 800, revenue: 40000, profit: 15000 },
        { reportDate: "2022-12-01", sales: 800, revenue: 40000, profit: 15000 },
    ];


    const chartRef = useRef();



    
    useEffect(() => {

        const margin = { top: 30, right: 30, bottom: 70, left: 60 },
            width = 800 - margin.left - margin.right,
            height = 700 - margin.top - margin.bottom;



 


        const svg = d3
            .select(chartRef.current)
            // .append("svg")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", `translate(${margin.left},${margin.top})`);

        const formattedData = salesData.map(d => ({
            date: d3.timeParse("%Y-%m-%d")(d.reportDate),
            sales: d.sales,
            revenue: d.revenue,
            profit: d.profit
        }));


        // создание оси X горизонталь date
        const xAxis = d3
            .scaleTime()
            .domain(d3.extent(formattedData, d => d.date))
            .range([0, width]);
        svg
            .append('g')
            .attr('transform', `translate(0, ${height})`)
            .call(d3.axisBottom(xAxis)
                .tickFormat(d3.timeFormat("%b"))
            );



        // создание оси Y вертикаль sales
        const yAxis = d3
            .scaleLinear()
            .domain([0, d3.max(salesData, (d) => d.sales)])
            .range([height, 0]);
        svg
            .append('g').call(d3.axisLeft(yAxis));





        let res = salesData.map(function(d){
            return d.key
        })

        let color = d3.scaleOrdinal()
            .domain(res)
            .range(['#e41a1c','#377eb8','#4daf4a'])


        // отрисовка линий 3 линии sales revenue profit
        const line = d3.line()
            .x((d) => xAxis(d.date))
            .y((d) => yAxis(d.sales))
             // .curve(d3[curve])


        svg // задаем стили каждой линии
            .selectAll('.path')
            .data(salesData)
            .enter()
            .append('path')
            .attr('fill', 'none')
            .attr('stroke', (d) => color(d.key))
            .attr('stroke-width', 1.5)
            .attr('d', line);



    }, [salesData]);

    return <svg ref={chartRef}/>;

};

export default AxisLeft;


Ответы (0 шт):