私は現在、Angular2にngx-chartsを使用していますが、いくつかの凡例をカスタマイズしたいと思います。凡例をチャートの下に配置するか、凡例フィールドの名前を変更するか、凡例を広くします(テキストの一部が切り取られるだけです)。
凡例をカスタマイズする良いオプションはありますか?それとも一般的に不可能ですか、それを行うための最良の方法は何ですか?現在、グラフの凡例は次のようになっています。
凡例の中には幅が広すぎるもの、切り取られたものもあります。たとえば、グラフの下に凡例を配置したいと思います...
凡例をチャートの下に配置するには、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>