ngx-charts折线图,如何始终显示带点的折线图作为数据点

时间:2019-05-08 23:29:21

标签: css angular ngx-charts

对于ngx-charts折线图,它显示折线图,但数据点没有点。 enter image description here

如果将鼠标悬停在数据点上,它将显示数据点的圆点以及标签工具提示。

enter image description here

我喜欢这样的折线图,以便始终用点显示所有数据点。

enter image description here

我需要您帮助如何在ngx-charts折线图中的数据点上显示点

以下是ngx图https://github.com/kedmenecr/cinnamon-angular5-with-ngx-charts

的示例

这是ngx-chart libary的源代码。 https://github.com/swimlane/ngx-charts

谢谢。

1 个答案:

答案 0 :(得分:2)

如果有人仍然需要此功能,我可以使用非超级干净的解决方案来解决此功能,但到目前为止它没有副作用:

enter image description here

定制服务在划线图上绘制点:

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提供了您的颜色作为数组,并基于例如索引进行了选择