按 Canvas 绘制仪表图
Draw gauge chart by Canvas
我可以通过 canvas 和函数 arc()
绘制仪表图。但是,形状是半个圆。
现在,我想画这样的gaugle图表(请忽略颜色或数字)。
怎么画呢?谢谢
更新:
我画图表是画2条弧线(我不用ctx.lineWidth
)
var min=Math.PI*.60;
var max=Math.PI*2+Math.PI*.40;
var R = 100;
var arcWidth = 40;
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.arc(100, 100, R-arcWidth, max, min, true);
ctx.arc(100, 100, R, min, max);
ctx.fillStyle = "red";
ctx.fill();
然而,在min
和max
的位置,图表是线而不是圆。我尝试使用 ctx.lineCap='round'
,但它不起作用。
只需根据您想要的规格百分比划出一个带有扫掠角的圆弧。
在您的示例中,0% 角度是(估计...)
PI * 0.60
你的 100% 角度是(再次估计...)
PI*2 + PI*.40
所以你的弧线总是从 angle = PI*0.60 开始。
您的弧线将以如下计算的角度结束:
zeroAngle + (hundredAngle-zeroAngle) * guagePercentageValue
下面是示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var PI=Math.PI;
var PI2=PI*2;
var cx=150;
var cy=150;
var r=80;
var min=PI*.60;
var max=PI2+PI*.40;
var percent=50;
ctx.lineCap='round';
ctx.font='24px verdana';
ctx.textAlign='center';
ctx.textBaseline='middle';
ctx.fillStyle='gray';
$myslider=$('#myslider');
$myslider.attr({min:0,max:100}).val(50);
$myslider.on('input change',function(){
percent=parseInt($(this).val());
drawGuage();
});
drawGuage();
function drawGuage(){
ctx.clearRect(0,0,cw,ch);
// draw full guage outline
ctx.beginPath();
ctx.arc(cx,cy,r,min,max);
ctx.strokeStyle='lightgray';
ctx.lineWidth=15;
ctx.stroke();
// draw percent indicator
ctx.beginPath();
ctx.arc(cx,cy,r,min,min+(max-min)*percent/100);
ctx.strokeStyle='red';
ctx.lineWidth=6;
ctx.stroke();
ctx.fillText(percent+'%',cx,cy);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input id=myslider type=range><br>
<canvas id="canvas" width=300 height=300></canvas>
我可以通过 canvas 和函数 arc()
绘制仪表图。但是,形状是半个圆。
现在,我想画这样的gaugle图表(请忽略颜色或数字)。
怎么画呢?谢谢
更新:
我画图表是画2条弧线(我不用ctx.lineWidth
)
var min=Math.PI*.60;
var max=Math.PI*2+Math.PI*.40;
var R = 100;
var arcWidth = 40;
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.beginPath();
ctx.arc(100, 100, R-arcWidth, max, min, true);
ctx.arc(100, 100, R, min, max);
ctx.fillStyle = "red";
ctx.fill();
然而,在min
和max
的位置,图表是线而不是圆。我尝试使用 ctx.lineCap='round'
,但它不起作用。
只需根据您想要的规格百分比划出一个带有扫掠角的圆弧。
在您的示例中,0% 角度是(估计...)
PI * 0.60
你的 100% 角度是(再次估计...)
PI*2 + PI*.40
所以你的弧线总是从 angle = PI*0.60 开始。
您的弧线将以如下计算的角度结束:
zeroAngle + (hundredAngle-zeroAngle) * guagePercentageValue
下面是示例代码和演示:
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
var PI=Math.PI;
var PI2=PI*2;
var cx=150;
var cy=150;
var r=80;
var min=PI*.60;
var max=PI2+PI*.40;
var percent=50;
ctx.lineCap='round';
ctx.font='24px verdana';
ctx.textAlign='center';
ctx.textBaseline='middle';
ctx.fillStyle='gray';
$myslider=$('#myslider');
$myslider.attr({min:0,max:100}).val(50);
$myslider.on('input change',function(){
percent=parseInt($(this).val());
drawGuage();
});
drawGuage();
function drawGuage(){
ctx.clearRect(0,0,cw,ch);
// draw full guage outline
ctx.beginPath();
ctx.arc(cx,cy,r,min,max);
ctx.strokeStyle='lightgray';
ctx.lineWidth=15;
ctx.stroke();
// draw percent indicator
ctx.beginPath();
ctx.arc(cx,cy,r,min,min+(max-min)*percent/100);
ctx.strokeStyle='red';
ctx.lineWidth=6;
ctx.stroke();
ctx.fillText(percent+'%',cx,cy);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input id=myslider type=range><br>
<canvas id="canvas" width=300 height=300></canvas>