the*_*ing 9 javascript charts chart.js
我有一个带有四个标签的饼图:
var data = [{
data: [50, 55, 60, 33],
labels: ["India", "China", "US", "Canada"],
backgroundColor: [
"#4b77a9",
"#5f255f",
"#d21243",
"#B27200"
],
borderColor: "#fff"
}];
Run Code Online (Sandbox Code Playgroud)
使用chartjs-plugin-datalabels插件我想用下面的代码显示每个Pie片中的百分比值:
formatter: (value, ctx) => {
let datasets = ctx.chart.data.datasets;
if (datasets.indexOf(ctx.dataset) === datasets.length - 1) {
let sum = 0;
datasets.map(dataset => {
sum += dataset.data[ctx.dataIndex];
});
let percentage = Math.round((value / sum) * 100) + '%';
return percentage;
} else {
return percentage;
}
},
color: '#fff',
}
Run Code Online (Sandbox Code Playgroud)
我获得了所有馅饼的100%价值,而不是相应的百分比.这是JSFiddle(https://jsfiddle.net/kingBethal/a1Lvn4eb/7/)
Hit*_*ua1 17
用2位小数精度更新小提琴.
您没有计算总和,而是仅为每个值存储当前值.
这是工作小提琴:https://jsfiddle.net/a1Lvn4eb/55/
var data = [{
data: [50, 55, 60, 33],
labels: ["India", "China", "US", "Canada"],
backgroundColor: [
"#4b77a9",
"#5f255f",
"#d21243",
"#B27200"
],
borderColor: "#fff"
}];
var options = {
tooltips: {
enabled: false
},
plugins: {
datalabels: {
formatter: (value, ctx) => {
let sum = 0;
let dataArr = ctx.chart.data.datasets[0].data;
dataArr.map(data => {
sum += data;
});
let percentage = (value*100 / sum).toFixed(2)+"%";
return percentage;
},
color: '#fff',
}
}
};
var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'pie',
data: {
datasets: data
},
options: options
});
Run Code Online (Sandbox Code Playgroud)
And*_*rov 12
这是 Chart.js >= 3.x 和 Chartjs-plugin-datalabels >= 2.x 的更新
chartjs-plugin-datalabels插件不再自动注册
(文档)
你必须手动完成
为所有图表注册插件
Chart.register(ChartDataLabels)
Run Code Online (Sandbox Code Playgroud)
或仅针对特定图表
var chart = new Chart(ctx, {
plugins: [ChartDataLabels],
options: {
// ...
}
})
Run Code Online (Sandbox Code Playgroud)
下面是渲染饼图的代码
Chart.register(ChartDataLabels)
Run Code Online (Sandbox Code Playgroud)
var chart = new Chart(ctx, {
plugins: [ChartDataLabels],
options: {
// ...
}
})
Run Code Online (Sandbox Code Playgroud)
var data = [{
data: [50, 55, 60, 33],
backgroundColor: [
"#4b77a9",
"#5f255f",
"#d21243",
"#B27200"
],
borderColor: "#fff"
}];
var options = {
tooltips: {
enabled: false
},
plugins: {
datalabels: {
formatter: (value, ctx) => {
const datapoints = ctx.chart.data.datasets[0].data
const total = datapoints.reduce((total, datapoint) => total + datapoint, 0)
const percentage = value / total * 100
return percentage.toFixed(2) + "%";
},
color: '#fff',
}
}
};
var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['India', 'China', 'US', 'Canada'],
datasets: data
},
options: options,
plugins: [ChartDataLabels],
});Run Code Online (Sandbox Code Playgroud)
我喜欢在接受的答案中添加一点,ctx.chart.data.datasets[0].data即使您通过单击图例过滤掉一些数据,也
总是为您提供完整的数据,这意味着即使您过滤掉了一些国家,您也将始终获得相同的国家/地区百分比。
我曾经context.dataset._meta[0].total得到过滤的总数。
这是工作片段:
var data = [{
data: [50, 55, 60, 33],
backgroundColor: [
"#4b77a9",
"#5f255f",
"#d21243",
"#B27200"
],
borderColor: "#fff"
}];
var options = {
tooltips: {
enabled: true
},
plugins: {
datalabels: {
formatter: (value, ctx) => {
let sum = ctx.dataset._meta[0].total;
let percentage = (value * 100 / sum).toFixed(2) + "%";
return percentage;
},
color: '#fff',
}
}
};
var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['India', 'China', 'US', 'Canada'],
datasets: data
},
options: options
});Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-datalabels@0.7.0"></script>
<canvas id="pie-chart"></canvas>Run Code Online (Sandbox Code Playgroud)
问题是你如何计算总和。见下文。
var data = [{
data: [50, 55, 60, 33],
labels: ["India", "China", "US", "Canada"],
backgroundColor: [
"#4b77a9",
"#5f255f",
"#d21243",
"#B27200"
],
borderColor: "#fff"
}];
var options = {
tooltips: {
enabled: false
},
plugins: {
datalabels: {
formatter: (value, ctx) => {
let datasets = ctx.chart.data.datasets;
if (datasets.indexOf(ctx.dataset) === datasets.length - 1) {
let sum = datasets[0].data.reduce((a, b) => a + b, 0);
let percentage = Math.round((value / sum) * 100) + '%';
return percentage;
} else {
return percentage;
}
},
color: '#fff',
}
}
};
var ctx = document.getElementById("pie-chart").getContext('2d');
var myChart = new Chart(ctx, {
type: 'pie',
data: {
datasets: data
},
options: options
});
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用带有数组缩减器的工具提示来执行百分比计算并显示它。
tooltips: {
callbacks: {
label: function (tooltipItem, data) {
try {
let label = ' ' + data.labels[tooltipItem.index] || '';
if (label) {
label += ': ';
}
const sum = data.datasets[0].data.reduce((accumulator, curValue) => {
return accumulator + curValue;
});
const value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
label += Number((value / sum) * 100).toFixed(2) + '%';
return label;
} catch (error) {
console.log(error);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20978 次 |
| 最近记录: |