可以在路由时重新调用饼图数据并渲染图表。
例如,假设我们有一个名为“piechart.component”的组件,它包含饼图代码,我们可以在该组件的“ngOnInit”生命周期钩子中初始化饼图:
import * as d3 from 'd3';
@Component({
selector: 'app-piechart',
templateUrl: './piechart.component.html',
styleUrls: ['./piechart.component.scss']
})
export class PiechartComponent implements OnInit {
data = [1, 2, 3, 4, 5];
private svg;
private margin = 50;
private width = 300;
private height = 300;
private radius = Math.min(this.width, this.height) / 2 - this.margin;
private colors;
constructor() { }
ngOnInit(): void {
this.createSvg();
this.createColors();
this.drawChart();
}
private createSvg(): void {
this.svg = d3.select("figure#chart")
.append("svg")
.attr("width", this.width)
.attr("height", this.height)
.append("g")
.attr(
"transform",
"translate(" + this.width / 2 + "," + this.height / 2 + ")"
);
}
private createColors(): void {
this.colors = d3.scaleOrdinal()
.domain(this.data)
.range(["#c7d3ec", "#a5b8db", "#879cc4", "#677795", "#5a6782"]);
}
private drawChart(): void {
const pie = d3.pie().value((d: any) => Number(d));
const data_ready = pie(this.data);
this.svg.selectAll('whatever')
.data(data_ready)
.enter()
.append('path')
.attr('d', d3.arc()
.innerRadius(0)
.outerRadius(this.radius)
)
.attr('fill', (d, i) => (this.colors(i)))
.attr("stroke", "black")
.style("stroke-width", "2px