Javascript 甜甜圈图表香草JS和HTML画布
我正在使用HTML画布元素和Javascript 甜甜圈图表香草JS和HTML画布,javascript,html,canvas,Javascript,Html,Canvas,我正在使用HTML画布元素和fillText()将标签放在图表上,用香草JavaScript编写一个甜甜圈饼图。我很难把标签放在图表的外侧,它们被画布的宽度切断了。这是一个问题的答案 以下是实际将标签打印到图表的代码片段: start_angle = 0; for (categ in catergories) { let categoryLabel = categ; val = catergories[categ]; let slice_angl
fillText()
将标签放在图表上,用香草JavaScript编写一个甜甜圈饼图。我很难把标签放在图表的外侧,它们被画布的宽度切断了。这是一个问题的答案
以下是实际将标签打印到图表的代码片段:
start_angle = 0;
for (categ in catergories) {
let categoryLabel = categ;
val = catergories[categ];
let slice_angle = 2 * Math.PI * val / total_value;
let pieRadius = Math.min(this.canvas.width / 2,this.canvas.height / 2);
let labelX = this.canvas.width / 2 + (pieRadius / 2) * Math.cos(start_angle + slice_angle / 2);
let labelY = this.canvas.height / 2 + (pieRadius / 2) * Math.sin(start_angle + slice_angle / 2);
if (this.options.doughnutHoleSize){
let offset = (pieRadius * this.options.doughnutHoleSize ) / 2;
labelX = this.canvas.width / 2 + (offset + pieRadius / 2) * Math.cos(start_angle + slice_angle / 2);
labelY = this.canvas.height / 2 + (offset + pieRadius / 2) * Math.sin(start_angle + slice_angle / 2);
}
this.ctx.fillStyle = "black";
this.ctx.font = "bold 11px Arial";
this.ctx.fillText(`${categoryLabel} ${val}`, labelX, labelY);
start_angle += slice_angle;
}
所需定位:
这是一个简单的例子,了解一些三角函数和画布文本API 我使用各个切片中心角度的cos和sin值来设置文本的水平和垂直对齐,如下所示:
this.ctx.textAlign = cos > 0 ? 'start' : 'end';
this.ctx.textBaseline = sin > 0 ? 'top' : 'bottom';
此外,我还向piechart构造函数添加了两个选项:
const monthlyPaymentChart = new Piechart({
canvas: canvas,
data: paymentInformation,
colors: pieChartColors,
doughnutHoleSize: 0.85,
labelDistanceFromOuterEdge: 5,
roomForLabels: 65,
});
- roomForLabels-告诉您要为标签保留多少空间
以像素为单位显示在饼图外部。如果有宽度 标签不适合画布,此值将增加以适应 它 - labelDistanceFromOuterEdge-标签与外部设备的距离
饼图的边缘(以像素为单位)
好极了!唯一的一件事是,当标签中有更多信息时,标签会被切断:修复了这一点,现在它会自动调整roomForLabels选项,如果给@cWeave的标签没有足够的空间,它只修复了另一个小错误,自动调整没有考虑labelDistanceFromOuterEdge选项-将其设置为高可能仍会使一些文本越过画布边缘,现在无法@cweave