gpt4 book ai didi

javascript - 修改 D3.js Circle Progress Graph 以显示百分比范围

转载 作者:行者123 更新时间:2023-11-30 00:09:25 27 4
gpt4 key购买 nike

我正在使用 d3.js 来显示圆形进度图。它工作得很好,但我想在图表上以不同的颜色显示特定的百分比范围。我想在图表上将 75% - 90% 显示为不同的颜色。我怎样才能做到这一点?我查看了圆环图来完成此操作,但我喜欢圆形图的动画效果,因此我想坚持使用它并对其进行修改以满足我的需求。

目标:

在图表上以不同的线条颜色添加 75%-90% 的百分比范围。该图表的存在是为了显示 75%-90% 的“准确率”。

奖励:

添加“75% 到 90%”标签,如下图所示: enter image description here

JS:

var colors = {
'pink': '#ffffff',
'yellow': '#f0ff08',
'green': '#47e495'
};

var color = colors.pink;
var line_two_color = colors.green;

var radius = 50;
var border = 3;
var padding = 10;
var startPercent = 0;
var endPercent = 0.90;


var twoPi = Math.PI * 2;
var formatPercent = d3.format('.0%');
var boxSize = 130;


var count = Math.abs((endPercent - startPercent) / 0.01);
var step = endPercent < startPercent ? -0.01 : 0.01;

var arc = d3.svg.arc()
.startAngle(0)
.innerRadius(radius)
.outerRadius(radius - border);

var parent = d3.select('div#circle_graph');

var svg = parent.append('svg')
.attr('width', boxSize)
.attr('height', boxSize);

var defs = svg.append('defs');

var g = svg.append('g')
.attr('transform', 'translate(' + boxSize / 2 + ',' + boxSize / 2 + ')');

var meter = g.append('g')
.attr('class', 'progress-meter');

meter.append('path')
.attr('class', 'background')
.attr('fill', '#ccc')
.attr('fill-opacity', 0.5)
.attr('d', arc.endAngle(twoPi));

var foreground = meter.append('path')
.attr('class', 'foreground')
.attr('fill', color)
.attr('fill-opacity', 1)
.attr('stroke', color)
.attr('stroke-width', 5)
.attr('stroke-opacity', 1)

var front = meter.append('path')
.attr('class', 'foreground')
.attr('fill', color)
.attr('fill-opacity', 1);

var numberText = meter.append('text')
.attr('fill', '#fff')
.attr('text-anchor', 'middle')
.attr('dy', '.35em');

function updateProgress(progress) {
foreground.attr('d', arc.endAngle(twoPi * progress));
front.attr('d', arc.endAngle(twoPi * progress));
numberText.text(formatPercent(progress));
}

var progress = startPercent;

(function loops() {
updateProgress(progress);

if (count > 0) {
count--;
progress += step;
setTimeout(loops, 10);
}
})();

CSS:

.progress-meter text {
font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 24px;
font-weight: bold;
}

HTML:

<div id="circle_graph"></div>

最佳答案

希望我能正确理解您的问题!

另请注意,如果您的数据以 %(而不是弧度)为单位,则必须添加 d3.scale 以将 [0,100] 域转换为 [0, 2pi]。

下面的代码模拟了一个带有两个独立弧的进度弧。一个用于 0-75% 范围,第二个用于 75% 以上。两条弧线都基于相同的数据绘制,但关键是在数据超过 75% 阈值时使用最小和最大函数来限制数据。

对于第一个bar,当进度超过75%时结束 Angular 停止...

.attr('d', function(d){
progressArc.startAngle(0)
return progressArc.endAngle( Math.min(d,(3/2)*Math.PI) )();
})

Math.min(d,(3/2)*Math.PI)

而对于第二个柱,结束 Angular 仅在数据超过 75% 后才开始变化...

.attr('d', function(d){
progressArc.startAngle((3/2)*Math.PI)
return progressArc.endAngle( Math.max(d,(3/2)*Math.PI ))();
})

Math.max(d,(3/2)*Math.PI

最终结果看起来像一根柱子在超过阈值时改变颜色。

var height = 20,
width = 70,
progress = 3;

d3.select('div').append('svg')
.attr('width','100%')
.attr('viewBox','0 0 ' + width + ' ' + height)


d3.select('svg').append('g')
.attr('transform','translate('+width/2+','+height/2+')')
.attr('id','main')

var progressArc = d3.svg.arc()
.innerRadius(7)
.outerRadius(9)
.startAngle(0)
.endAngle(2*Math.PI)

var progressBar1 = d3.select('#main').append('g').attr('class','progressBar1'),
progressBar2 = d3.select('#main').append('g').attr('class','progressBar2');

progressBar1.selectAll('path')
.data([progress])
.enter()
.append('path')
.attr('d', function(d){
progressArc.startAngle(0)
return progressArc.endAngle( Math.min(d,(3/2)*Math.PI) )();
})

progressBar2.selectAll('path')
.data([progress])
.enter()
.append('path')
.attr('fill','red')
.attr('d', function(d){
progressArc.startAngle((3/2)*Math.PI)
return progressArc.endAngle( Math.max(d,(3/2)*Math.PI ))();
})

var update = function(){

progress = progress >= 2*Math.PI ? 0 : progress + Math.random()*(1/200)*Math.PI;

console.log(progress)
progressBar1.selectAll('path')
.data([progress])
.attr('d', function(d){
progressArc.startAngle(0)
return progressArc.endAngle( Math.min(d,(3/2)*Math.PI) )();
})

progressBar2.selectAll('path')
.data([progress])
.attr('d', function(d){
progressArc.startAngle((3/2)*Math.PI)
return progressArc.endAngle( Math.max(d,(3/2)*Math.PI ))();
})

}

setInterval( update, 12);
svg{
border: solid green 1px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

<div></div>

关于javascript - 修改 D3.js Circle Progress Graph 以显示百分比范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122470/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com