Как построить простую кольцевую диаграмму, используя D3js и Angular 7
Я создаю кольцевую диаграмму в Angular, используя D3.js v5. Все другие простые графики, такие как гистограмма, окружности, линии и т. Д., Работают правильно, но функция pie() выдает некоторую ошибку. Может кто-нибудь предложить мне, как правильно использовать функцию pie() в Angular?
Я получаю ошибки в нижеприведенных сценариях.
при настройке цветового домена, он не принимает данные, он говорит, что ему нужно
ReadOnlyArray<String>
так попробовал дать жестко закодированный домен["a","b","c","d","e"]
pie()
-> Не принимает значения, не знаю почему, много пробовал здесь.this.color(d.data.key))
->this.color
не принимает данные доступа и ключ.
Нужно решить все вышеперечисленные вопросы.
код выглядит следующим образом:
export class DonutChartComponent implements OnInit {
width = 450
height = 450
margin = 40
radius;
svg;
color;
pie;
data_ready;
// Create dummy data
public data = {a: 9, b: 20, c:30, d:8, e:12}
constructor() { }
ngOnInit() {
this.draw();
}
draw(){
this.radius = Math.min(this.width, this.height) / 2 - this.margin
this.svg = d3.select("app-donut-chart")
.append("svg")
.attr("width", this.width)
.attr("height", this.height)
.append("g")
.attr("transform", "translate(" + this.width / 2 + "," +
this.height / 2 + ")");
// set the color scale
this.color = d3.scaleOrdinal()
.domain(this.data) // this.data gives error here
.range(d3.schemeDark2);
console.log(d3.scaleOrdinal());
// Compute the position of each group on the pie:
this.pie = d3.pie()
.value(function(d) {return d.values}); //error here
this.data_ready = this.pie(d3.entries(this.data))
this.svg
.selectAll('whatever')
.data(this.data_ready)
.enter()
.append('path')
.attr('d', d3.arc()
.innerRadius(100) // This is the size of the donut hole
.outerRadius(this.radius))
.attr('fill', function(d){ return(this.color(d.data.key)) })
//error here
.attr("stroke", "black")
.style("stroke-width", "2px")
.style("opacity", 0.7)
}
}
Я ожидаю, что если код работает правильно, я могу увидеть диаграмму пончик на основе данных.
1 ответ
Пара вещей неправильно:
Ваша цветовая гамма
.domain
ожидает список строк. Изменить на:.domain(Object.keys(this.data))
Ваш генератор пирогов должен быть определен как:
this.pie = d3.pie() .value(function (d) { return d.value })
Теперь это работает.
this.radius = Math.min(this.width, this.height) / 2 - this.margin;
this.svg = select("pie-chart")
.append("svg")
.attr("width", this.width)
.attr("height", this.height)
.append("g")
.attr("transform", "translate(" + this.width / 2 + "," +
this.height / 2 + ")");
this.color = scaleOrdinal()
.domain(Object.keys(this.data))
.range(schemeDark2);
console.log(scaleOrdinal());
this.pie = pie()
.value((d) => d.valueOf());
this.dataReady = this.pie(entries(this.data));
this.svg
.selectAll("whatever")
.data(this.dataReady)
.enter()
.append("path")
.attr("d", arc()
.outerRadius(this.radius))
.attr("fill", (d) => (this.color(d.data.key)))
.attr("stroke", "black")
.style("stroke-width", "2px")
.style("opacity", 0.7);