D3 with Angular - 半饼图图表颜色序列
D3 with Angular - Half Pie chart Chart colors sequence
有人可以帮我解决图表颜色问题吗?
我在 angular 中使用 d3.js 创建半饼图。
我想要 3 部分,我应该有 3 种颜色。
我想要 3 种颜色,每种颜色都有一定的范围。
我的数据为 {a: 50, b: 50, c: 50},颜色为 ['green','yellow','red']。
为此,图表被平均分割并且图表颜色按正确顺序排列(从绿色开始到红色结束)。这是正确的,如附图所示。
Correct Chart
但是当我提供 {a: 50, b: 30, c: 70} 的值时,我得到的颜色顺序不同。看起来它首先呈现最高值 (70),如下所示。
Incorrect Chart
我的代码:
private theData = { a: 50, b: 30, c: 70};
private svg:any;
private svgWidth = 200;
private svgHeight = 125;
private colorRanges:any;
private pie:any;
this.svg = d3
.select('div#pie')
.append('svg')
.attr('width',this.svgWidth)
.attr('height',this.svgHeight)
.attr('id','pie-svg')
.append('g')
.attr('class','ps')
.attr(
'transform',
'translate('+this.svgWidth/2+',115)');
this.colorRanges = d3.scaleOrdinal().range(['green','yellow','red']);
this.pie = d3
.pie()
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180))
.value((d: any) => d[1]);
this.svg.selectAll('rect')
.data(this.pie(Object.entries(this.theData)))
.join('path')
.attr('d',
d3.arc().innerRadius(75).outerRadius(35))
.attr('fill', (d:any) => this.colorRanges(d.data[0]))
.attr('stroke','none')
.style('stroke-width','1px')
.style('opacity',1);
您可以指定饼图的切片方式sorted:
d3.pie()
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180))
.value(d => d[1])
.sort((a, b) => d3.ascending(a[0], b[0]))
这会将“a”的切片放在第一位,然后是“b”,然后是“c”。
此外,我建议为您的色标设置域,这样您就不会依赖 Object.entries()
:
返回的顺序
d3.scaleOrdinal()
.domain(['a', 'b', 'c'])
.range(['green','yellow','red'])
有人可以帮我解决图表颜色问题吗?
我在 angular 中使用 d3.js 创建半饼图。 我想要 3 部分,我应该有 3 种颜色。 我想要 3 种颜色,每种颜色都有一定的范围。
我的数据为 {a: 50, b: 50, c: 50},颜色为 ['green','yellow','red']。 为此,图表被平均分割并且图表颜色按正确顺序排列(从绿色开始到红色结束)。这是正确的,如附图所示。
Correct Chart
但是当我提供 {a: 50, b: 30, c: 70} 的值时,我得到的颜色顺序不同。看起来它首先呈现最高值 (70),如下所示。
Incorrect Chart
我的代码:
private theData = { a: 50, b: 30, c: 70};
private svg:any;
private svgWidth = 200;
private svgHeight = 125;
private colorRanges:any;
private pie:any;
this.svg = d3
.select('div#pie')
.append('svg')
.attr('width',this.svgWidth)
.attr('height',this.svgHeight)
.attr('id','pie-svg')
.append('g')
.attr('class','ps')
.attr(
'transform',
'translate('+this.svgWidth/2+',115)');
this.colorRanges = d3.scaleOrdinal().range(['green','yellow','red']);
this.pie = d3
.pie()
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180))
.value((d: any) => d[1]);
this.svg.selectAll('rect')
.data(this.pie(Object.entries(this.theData)))
.join('path')
.attr('d',
d3.arc().innerRadius(75).outerRadius(35))
.attr('fill', (d:any) => this.colorRanges(d.data[0]))
.attr('stroke','none')
.style('stroke-width','1px')
.style('opacity',1);
您可以指定饼图的切片方式sorted:
d3.pie()
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180))
.value(d => d[1])
.sort((a, b) => d3.ascending(a[0], b[0]))
这会将“a”的切片放在第一位,然后是“b”,然后是“c”。
此外,我建议为您的色标设置域,这样您就不会依赖 Object.entries()
:
d3.scaleOrdinal()
.domain(['a', 'b', 'c'])
.range(['green','yellow','red'])