我不知道如何用图表来做这件事。js。
请帮帮我。
我的Javascript代码:
function drawPie(canvasId,data,legend){
var ctx = $("#pie-canvas-" + canvasId).get(0).getContext("2d");
var piedata = [];
$.each(data,function(i,val){
piedata.push({value:val.count,color:val.color,label:val.status});
});
var options =
{
tooltipTemplate: "<%= Math.round(circumference / 6.283 * 100) %>%",
}
var pie = new Chart(ctx).Pie(piedata,options);
if(legend)document.getElementById("legend").innerHTML = pie.generateLegend();
}
php代码:
printf('<table><tr>');
echo '<td style="text-align: right;"><canvas id="pie-canvas-'
. $canvasId
. '" width="256" height="256" ></canvas></td><td style="text-align: left;width:360px;height:auto" id="legend" class="chart-legend"></td></tr></table>';
echo '<script type="text/javascript">drawPie('
. $canvasId
. ', '
. $data3
.', '
. $legend
. ');</script>';
据我所知,我不相信那个图表。JS有任何功能来帮助在饼图上绘制文本。但这并不意味着你不能用原生JavaScript自己完成。我将为您提供一个如何执行此操作的示例,下面是为饼图中的每个段绘制文本的代码:
function drawSegmentValues()
{
for(var i=0; i<myPieChart.segments.length; i++)
{
// Default properties for text (size is scaled)
ctx.fillStyle="white";
var textSize = canvas.width/10;
ctx.font= textSize+"px Verdana";
// Get needed variables
var value = myPieChart.segments[i].value;
var startAngle = myPieChart.segments[i].startAngle;
var endAngle = myPieChart.segments[i].endAngle;
var middleAngle = startAngle + ((endAngle - startAngle)/2);
// Compute text location
var posX = (radius/2) * Math.cos(middleAngle) + midX;
var posY = (radius/2) * Math.sin(middleAngle) + midY;
// Text offside to middle of text
var w_offset = ctx.measureText(value).width/2;
var h_offset = textSize/4;
ctx.fillText(value, posX - w_offset, posY + h_offset);
}
}
饼图有一个存储在PieChart.segments
中的段数组,我们可以查看这些段的start Angle
和endAngle
,以确定文本之间的角度MiddleAngle.然后我们将沿着这个方向移动半径/2
,以弧度表示图表的中间点。
在上面的例子中,完成了一些其他的清理操作,由于在fillText()
中绘制的文本的位置是右上角,我们需要获得一些偏移值来更正。最后根据图表本身的大小确定文本大小,图表越大,文本越大。
小提琴示例
只需稍加修改,就可以将数据集的离散数值更改为图形中的百分位数。要获取数据集中项目的总值
,请调用此总值
。然后在每个分段上,您可以通过执行以下操作找到百分比:
Math.round(myPieChart.segments[i].value/totalValue*100)+'%';
这里的部分是myPieChart。段[i]。value/totalValue是计算段在图表中所占百分比的值。例如,如果当前段的值为50
,而总值为200
。然后段占用的百分比将为:50/200=
var value = myPieChart.segments[i].value/totalValue*100;
if(Math.round(value) !== value)
value = (myPieChart.segments[i].value/totalValue*100).toFixed(1);
value = value + '%';
用小数点修改百分位数示例
摆弄整数百分位数示例
我发现了一个优秀的Chart.js
插件,它完全符合你的要求:https://github.com/emn178/Chart.PieceLabel.js
对于Chart.js2.0及以上版本,Chart对象数据已更改。对于使用Chart.js2.0的用户,下面是使用HTML5 CanvasfillText()
方法在饼图切片内显示数据值的示例。代码也适用于甜甜圈图表,唯一的区别是创建图表时的type:'pie'
与type:'doughut'
。
脚本:
Javascript
var data = {
datasets: [{
data: [
11,
16,
7,
3,
14
],
backgroundColor: [
"#FF6384",
"#4BC0C0",
"#FFCE56",
"#E7E9ED",
"#36A2EB"
],
label: 'My dataset' // for legend
}],
labels: [
"Red",
"Green",
"Yellow",
"Grey",
"Blue"
]
};
var pieOptions = {
events: false,
animation: {
duration: 500,
easing: "easeOutQuart",
onComplete: function () {
var ctx = this.chart.ctx;
ctx.font = Chart.helpers.fontString(Chart.defaults.global.defaultFontFamily, 'normal', Chart.defaults.global.defaultFontFamily);
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
this.data.datasets.forEach(function (dataset) {
for (var i = 0; i < dataset.data.length; i++) {
var model = dataset._meta[Object.keys(dataset._meta)[0]].data[i]._model,
total = dataset._meta[Object.keys(dataset._meta)[0]].total,
mid_radius = model.innerRadius + (model.outerRadius - model.innerRadius)/2,
start_angle = model.startAngle,
end_angle = model.endAngle,
mid_angle = start_angle + (end_angle - start_angle)/2;
var x = mid_radius * Math.cos(mid_angle);
var y = mid_radius * Math.sin(mid_angle);
ctx.fillStyle = '#fff';
if (i == 3){ // Darker text color for lighter background
ctx.fillStyle = '#444';
}
var percent = String(Math.round(dataset.data[i]/total*100)) + "%";
//Don't Display If Legend is hide or value is 0
if(dataset.data[i] != 0 && dataset._meta[0].data[i].hidden != true) {
ctx.fillText(dataset.data[i], model.x + x, model.y + y);
// Display percent in another line, line break doesn't work for fillText
ctx.fillText(percent, model.x + x, model.y + y + 15);
}
}
});
}
}
};
var pieChartCanvas = $("#pieChart");
var pieChart = new Chart(pieChartCanvas, {
type: 'pie', // or doughnut
data: data,
options: pieOptions
});
HTML
<canvas id="pieChart" width=200 height=200></canvas>
jsFiddle
我最近更新了我的charts.js库到最新版本(2.5.0)。这个版本不显示图表上的标签。 我有一个在《小提琴手:http://jsfiddle.net/g6fajwg8》上工作的例子。 但是,我完全按照示例中的方式定义了我的图表,但仍然看不到图表上的标签。 注意:在Google和Stackoverflow上有很多这样的问题,但其中大多数都是关于以前的版本,这些版本在它们上运行良好。
我一直在使用Chart.Js,但由于时间限制和个人对D3等人的SVG路线的偏好,我尽最大努力避免进入画布本身。 我在仪表板页面上混合了各种图表,除了一个问题外,其他一切看起来都很棒——你必须将鼠标悬停在饼图段上才能看到潜在的%或值。 对于仪表板视图,我的用户更喜欢快速查看数据段上的一些数据标签,就像Excel一样,可能更容易用图像进行解释: https://support.office.com/e
问题内容: 在我的项目中,我想在饼图中显示每个员工在系统中注册了多少个机构。机构表包含一个外键,该外键具有注册该机构的员工的ID,因此每个机构都有与之关联的一名员工。 我构建了以下代码,但无法继续进行下去: 我尝试在查询中使用GROUP BY,但这并不能解决问题。 编辑 :实际上,使用GROUP BY语句对于此作业是必需的。请阅读接受的答案及其评论。 问题答案: 您不需要。使用接受查询的构造函数“
我的图表中x轴上的点太多。我想限制显示点的最大值为100。但同时仍然显示相同的图表。完全相同的图表-但点数较少。 我的图表截图有太多的点 我不知道如何在服务器端用PHP实现它,所以我在想在chart.js中是否有客户端的解决方案?
问题内容: 需要查看条形图中的条形所代表的确切值,而不是Y轴上的近似值。 怎么可能呢? 谢谢阅读! 问题答案: 在iReport 3.7.6中,您可以仅选中BarPlot属性下的“显示标签”框。 在以前的版本(3.1.4)中,我必须创建一个ChartCustomizer类。 如果您需要格式化标签中的数字(例如,设置为百分比,添加千位分隔符等),那么即使在新版本中,您也绝对需要一个ChartCust
问题内容: 我正在使用python 3.5.2,我想制作一个嵌入了png图像的饼图。我有一些我想插入切片的散装产品的图片。例如,一片草莓,另一片覆盆子。就像http://www.python- course.eu/images/pie_chart_with_raspberries.png 显示的图片一样。 我可以生成图像,甚至可以绘制图像而不是点,如此处所示Matplotlib:如何绘制图像而不是