web-dev-qa-db-ja.com

Angular凡例をカスタマイズするためのngx-chartsオプション?

私は現在、Angular2にngx-chartsを使用していますが、いくつかの凡例をカスタマイズしたいと思います。凡例をチャートの下に配置するか、凡例フィールドの名前を変更するか、凡例を広くします(テキストの一部が切り取られるだけです)。

凡例をカスタマイズする良いオプションはありますか?それとも一般的に不可能ですか、それを行うための最良の方法は何ですか?現在、グラフの凡例は次のようになっています。

enter image description here

凡例の中には幅が広すぎるもの、切り取られたものもあります。たとえば、グラフの下に凡例を配置したいと思います...

7
MMM

凡例の位置

凡例をチャートの下に配置するには、legendPosition入力を使用できます。

<ngx-charts-chart [legendPosition]="'below'" [results]="chartData" [legend]="true"></ngx-charts-chart>

legendPositionのオプションは、 'right'(デフォルト)および 'below'のみです。

凡例フィールドの名前を変更

凡例フィールドをカスタマイズするためのオプションはないようです(高度な円グラフには、よりカスタマイズ可能な凡例がありますが、例は他の種類のグラフです)。 chartData[i].name値を凡例に表示するとおりに正確に設定し、ツールチップをカスタマイズして別のフィールド名を表示します。

この回答は、ツールチップをカスタマイズする方法の概要を示しています。 そこから、異なるフィールド名を除いてデフォルトのツールチップのように見える折れ線グラフの例を作成しました。

<ngx-charts-line-chart [legendPosition]="'right'" [results]="chartData" [legend]="true">
    <ng-template #tooltipTemplate let-model="model">
        <xhtml:div class="area-tooltip-container">
            <span class="tooltip-label">{{ formatFieldName(model.series) }} • {{ formatXvalue(model.name) }}</span>
            <span class="tooltip-val">{{ formatYvalue(model.value) }}</span>
        </xhtml:div>
    </ng-template>
    <ng-template #seriesTooltipTemplate let-model="model">
        <xhtml:div class="area-tooltip-container">
            <xhtml:div *ngFor="let tooltipItem of model" class="tooltip-item">
                <span class="tooltip-item-color" [style.background-color]="tooltipItem.color">
                </span>
                {{ formatFieldName(tooltipItem.series) }}: {{ formatYvalue(tooltipItem.value) }}
            </xhtml:div>
        </xhtml:div>
    </ng-template>
</ngx-charts-line-chart>

凡例の幅を変更

凡例の幅はngx-charts-chart他のチャートが拡張するコンポーネント。データ型に応じて、グラフコンテナーの約1/6または1/12に幅を設定します。この凡例に異なる幅を入力する方法はないため、最も簡単な解決策は、自動幅が機能しない場合にlegendPositionを 'below'に設定することです。

ただし、チャートに組み込まれた凡例を使用する必要はありません!次に、より複雑な(ただし、より微調整可能な)代替手段を示します。set [legend]="false"をチャートに追加してから、新しいngx-charts-legendチャート外のコンポーネント。

この外部凡例に幅と高さを入力するか、サイズ変更をより敏感に処理するdivにラップすることができます。後者の方法を使用する場合、凡例の幅をコンテナの100%に設定する必要がありました。

このソリューションを機能させるには、外部の凡例アクティベーションイベントをチャートにバインドし、Initの凡例入力プロパティの一部を設定する必要があります。チャートを含むコンポーネントには、次のようなものが必要です。

import { ColorHelper } from '@swimlane/ngx-charts';
...
export class ChartContainerComponent implements OnInit {
    public activeEntries: any[];
    public chartData: { name: string, series: { name: string, value?: string | number }[] }[];
    public chartNames: string[];
    public colors: ColorHelper;
    public colorScheme = { domain: ['#0000FF', '#008000'] }; // Custom color scheme in hex

    public legendLabelActivate(item: any): void {
        this.activeEntries = [item];
    }

    public legendLabelDeactivate(item: any): void {
        this.activeEntries = [];
    }

    public ngOnInit(): void {
        // Get chartNames
        this.chartNames = this.chartData.map((d: any) => d.name);
        // Convert hex colors to ColorHelper for consumption by legend
        this.colors = new ColorHelper(this.colorScheme, 'ordinal', this.chartNames, this.colorScheme);
    }

次に、テンプレート(それぞれ幅の半分をとるグラフと凡例付き)は次のようになります。

<div fxLayout="row">
    <div fxFlex="50%">
        <ngx-charts-line-chart [legend]="false" [activeEntries]="activeEntries" [results]="chartData" [scheme]="colorScheme"></ngx-charts-line-chart>
    </div>
    <div fxFlex="50%">
        <ngx-charts-legend fxFlex="100%" class="chart-legend" [data]="chartNames" [title]="'Legend Title'" [colors]="colors" (labelActivate)="legendLabelActivate($event)" (labelDeactivate)="legendLabelDeactivate($event)"></ngx-charts-legend>
    </div>
</div>
9
Maya Sol