上面有图表扇区大小恒定的示例,只是它们的颜色发生了变化,这并不总是好的,这是另一个具有可变扇区大小的选项(在此示例中它们的数量相同,取决于分辨率)现在,在值的边缘,减小扇区的大小可以使颜色保持平滑,并且单独调整分辨率,即 不依赖于数据量,饼图模型本身现在是由D3通过Pie pie shape generator计算出来的。
-
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.percent-score {
font: 10px sans-serif;
line-height: 1;
font-weight: bold;
font-size: 4em;
}
</style>
<body>
<svg width="900" height="500"></svg>
<script src="https://d3js.org/d3.v4.min.js"></script>
<script>
// оределяем рабочую область и устанавливаем начало координат в ее центр
var svg = d3.select("svg"),
width = svg.attr("width"),
height = svg.attr("height"),
g = svg.append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var radius = d3.min([width, height]) / 2;
var percent, ticknum;
var indata = 200; // шкала данных от 0 до indata
var gradient = 50; //плавность цвета (разрешение)
// вычисление цветов секторов в соответствии с разрешением
var color = d3.scaleLinear()
.domain([0, gradient - 1, gradient, 2 * gradient])
.range(["yellow", "orange", "blue", "lightblue"])
.interpolate(d3.interpolateRgb);
// вычисление размеров секторов
var pie = d3.pie()
.sort(null);
var arc = d3.arc();
// инициализация диаграммы и установка цветов секторам
var path = g.datum(d3.range(gradient * 2)).selectAll("path")
.data(pie)
.enter()
.append("path")
.attr("d", arc.innerRadius(radius - 120).outerRadius(radius - 80))
.style("fill", function(d, i) {
return color(i);
});
g.append("text")
.attr("class", "percent-score")
.attr("dy", ".35em") // выравниваем текст по центру диаграммы
.attr("text-anchor", "middle")
.attr("id", "percent-text");
(function tick() {
ticknum = (ticknum < indata) ? ticknum + 1 : 0;
percent = (ticknum / indata * 100) | 0; // получаем целое число %
// определяем коэффициент для расчета размера сектора каждой из 2-х частей диаграммы
// если текущий сектор меньше gradient то размер сектора увеличивается
// (это увеличивающаяся половина секторов диаграммы) иначе уменьшается
var sectorsize = d3.scaleThreshold()
.domain([gradient])
.range([ticknum / gradient, (indata - ticknum) / gradient]);
// расчет модели диаграммы
pie.value(function(d) {
return sectorsize(d);
});
path.data(pie) // перерисовка секторов и поправка для конечной границы сектора - убираем артефакты
.attr("d", arc.endAngle(function(d) {
return d.endAngle + .01;
}));
d3.select("#percent-text")
.text(percent + "%");
setTimeout(tick, 30000 / indata);
})();
</script>
您可能对这样的解决方案感兴趣......
有这样一个 D3JS(数据驱动文档)库,它允许您通过 扩展 SVG 的功能
来实现美丽的事物,包括您的任务:
和静态版本:
但没有具有非线性梯度的 D3 复杂性(沿圆圈)
有任何想法吗?虽然前面的2个答案对作者来说已经足够了,虽然梯度的问题显然没有解决。
更新1:
上面有图表扇区大小恒定的示例,只是它们的颜色发生了变化,这并不总是好的,这是另一个具有可变扇区大小的选项(在此示例中它们的数量相同,取决于分辨率)现在,在值的边缘,减小扇区的大小可以使颜色保持平滑,并且单独调整分辨率,即 不依赖于数据量,饼图模型本身现在是由D3通过Pie pie shape generator计算出来的。
顺便说一句,这里提出了一个类似的问题
这就是拐杖选项。将 stroke-dashoffset 从 0(全橙色圆圈)更改为 564(全蓝色)。我没有掌握百分比选项,也许你可以这样做。
codepen上的代码
如果您需要静态图像,而不动态更改橙色圆圈,那么我会这样做:
1. 使用circlarc.svg绘制 2 个圆圈- 首先是一个完整的圆圈,然后是一个小部分。2.为每个添加一个渐变(例如angerousTools)。
我花了不到一分钟的时间。