линейная диаграмма ngx-charts, как постоянно отображать линейную диаграмму с точкой для точки данных

для линейной диаграммы ngx-charts она показывает линейную диаграмму, но для точки данных нет точки. введите описание изображения здесь

При наведении указателя мыши на точку данных отображается точка для пинты данных, а также всплывающая подсказка с меткой.

введите описание изображения здесь

Мне нравится, когда на линейной диаграмме все точки данных отображаются постоянно, как это.

введите описание изображения здесь

Мне нужна ваша помощь в том, как показать точку в точке данных на линейной диаграмме ngx-charts

Вот образец для ngx-диаграммы https://github.com/kedmenecr/cinnamon-angular5-with-ngx-charts

Вот исходный код библиотеки ngx-chart. https://github.com/swimlane/ngx-charts

Благодарю.


person Steve    schedule 08.05.2019    source источник
comment
github.com/swimlane/ngx-charts/issues/467 обратитесь к этому вопросу . Это невозможно с ngx-диаграммами.   -  person Shabbir Dhangot    schedule 03.06.2020
comment
вы нашли какое-либо решение для этого же?   -  person Shabbir Dhangot    schedule 03.06.2020


Ответы (1)


Если кому-то все еще нужна эта функция, я обошел эту функцию с помощью не сверхчистого решения, но пока оно работает без побочных эффектов:

введите описание изображения здесь

специальный сервис для рисования точек на линейной диаграмме:

import { Injectable } from '@angular/core';
@Injectable()
export class CustomLinerChartService {
    /**
     * custom: override SVG to have the dots display all the time over the liner chart
     * since it's not supported anymore from ngx chart
     */

    showDots(chart) {
        let index = 0;
        const paths = chart.chartElement.nativeElement.getElementsByClassName(
            'line-series'
        );
        const color = chart.chartElement.nativeElement.getElementsByClassName(
            'line-highlight'
        );

        for (let path of paths) {
            const chrtColor = color[index].getAttribute('ng-reflect-fill');
            const pathElement = path.getElementsByTagName('path')[0];
            const pathAttributes = {
                'marker-start': `url(#dot${index})`,
                'marker-mid': `url(#dot${index})`,
                'marker-end': `url(#dot${index})`
            };
            this.createMarker(chart, chrtColor, index);
            this.setAttributes(pathElement, pathAttributes);
            index += 1;
        }
    }

    /**
     * create marker
     *
     */

    createMarker(chart, color, index) {
        const svg = chart.chartElement.nativeElement.getElementsByTagName('svg');
        var marker = document.createElementNS(
            'http://www.w3.org/2000/svg',
            'marker'
        );
        var circle = document.createElementNS(
            'http://www.w3.org/2000/svg',
            'circle'
        );
        svg[0].getElementsByTagName('defs')[0].append(marker);
        marker.append(circle);
        const m = svg[0].getElementsByTagName('marker')[0];
        const c = svg[0].getElementsByTagName('circle')[0];

        const markerAttributes = {
            id: `dot${index}`,
            viewBox: '0 0 10 10',
            refX: 5,
            refY: 5,
            markerWidth: 5,
            markerHeight: 5
        };

        const circleAttributes = {
            cx: 5,
            cy: 5,
            r: 5,
            fill: color
        };
        m.append(circle);

        this.setAttributes(m, markerAttributes);
        this.setAttributes(c, circleAttributes);
    }

    /**
     * set multiple attributes
     */
    setAttributes(element, attributes) {
        for (const key in attributes) {
            element.setAttribute(key, attributes[key]);
        }
    }
}

и после того, как ваше представление начнется и данные будут установлены для вызова диаграммы:

@ViewChild('chart') chart: any;

ngAfterViewInit() {
    this.customLinerChartService.showDots(this.chart);
}

убедитесь, что на вашем графике есть ссылка:

<ngx-charts-line-chart #chart>

ОБНОВЛЕНИЕ

вы не можете полагаться на класс ng-reflect-fill, так как он просто добавлен в настроение разработки, поэтому insted предоставляет ваши цвета в виде массива и выбирает его, например, на основе индекса

person Hasan Daghash    schedule 19.06.2020
comment
это сработало отлично, за исключением того, что при использовании нескольких диаграмм точки рисуются только на одной диаграмме. Я исправил это, добавив индекс в элементы маркера и кружка для получения: const m = svg [0] .getElementsByTagName ('marker') [index]; const c = svg [0] .getElementsByTagName ('круг') [индекс]; - person WtFudgE; 24.07.2020
comment
Есть ли способ перерисовать точки после изменения набора данных диаграммы? - person Gereon99; 29.07.2020
comment
На самом деле я только что нашел способ, вызвать service.showDots () вручную после изменения набора данных не работает. Однако выполнение setTimeout (() = ›{this.service.showDots (this.chart);}, 0); работает. Есть ли способ сделать это без использования setTimeout ()? - person Gereon99; 29.07.2020
comment
@WtFudgE в моем проекте я рассматриваю каждую диаграмму как отдельный компонент, в этом случае вы хороши - person Hasan Daghash; 05.08.2020
comment
@ Gereon99 просто звоните этому парню каждый раз, когда обновляете данные: this.customLinerChartService.showDots (this.chart); - person Hasan Daghash; 05.08.2020