Mak*_*aki 3 javascript python onclick bar-chart chart.js
我正在构建一个网络应用程序,您可以在其中选择航空公司并获得包含五个类别(公司、食品、行李、准时性、员工)分数的条形图。当用户单击图表的不同部分时,我想获取公司名称和类别的值。它是使用公司名称和类别的值在 Python 中做进一步的事情。
例如,在下图中,当用户单击大绿色条(右侧第四条)时,我希望我的 JS 接收到company="Air France", category="punctuality"
. 我想我需要做点什么,onclick
但无法弄清楚......
上下文:根据您在表单框中选择的公司,Python 后端将 json 数据返回给 JS。在JS中addGroupBarChart
使用Chart.js绘制图表并将其嵌入到html中的canvas元素中。
这是 JavaScript 的摘录
document.getElementById('button').onclick = function(){
/* returns the companies value chosen from the dropdown */
/* and draw a chart using addGroupBarChart function */
let companies = $("#companies").val();
let headers = new Headers()
let init = {
method : 'GET',
headers : headers
}
let params = {
'companies':companies
}
let url = getWebAppBackendUrl('/get_stats')+'/'+JSON.stringify(params)
let promise = fetch(url, init)
.then(function(response){
response.json()
.then(function(data){
addGroupBarChart(data.barChartGroup.company,
data.barChartGroup.labels);
})
});
}
document.getElementById("bar-chart-group").onclick = function(......) {
/* returns the company and category chosen from the chart */
/* this is the function I don't know how to build */
let activePoints = // here I assume I need getPointsAtEvent(evt) but not sure...
let company = // company value based on the click on the chart
let category = // category value based on the click on the chart
let headers = new Headers()
let init = {
method : 'GET',
headers : headers
}
let params = {
'company':company,
'category':category
}
let url = getWebAppBackendUrl('/get_table')+'/'+JSON.stringify(params)
let promise = fetch(url, init)
.then(function(response) {
response.json()
.then(function(data){
// function to add table
})
});
}
function addGroupBarChart(data, labels) {
/* function to add a bar chart using the data returned from Python backend */
document.getElementById('bar-card').innerHTML = '<canvas id="bar-chart-group" chart-click="onClick"></canvas>';
i = 1
arr = []
data.forEach(function(d){
company = Object.keys(d);
values = d[company]['data'];
dataset_company = {
label:company,
backgroundColor: default_colors[i],
data:values};
console.log("dataset_company", dataset_company);
arr.push(dataset_company);
i+=1;
})
let data_grouped = {
labels: labels,
datasets: arr
};
new Chart(document.getElementById("bar-chart-group"), {
type: "bar",
data: data_grouped,
options: {
title: {
display: false,
text: "Sentiment by category"
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
data
和labels
争论看起来addGroupBarChart
像
data = [{"Air France":{"data":[0.1, -0.2, 0.3, -0.1, 0.1]}},
{"Lufthansa":{"data":[0.3, -0.2, 0.5, 0.2, 0.1]}}]
labels = ["company", "food", "luggage", "punctuality", "staff"]
Run Code Online (Sandbox Code Playgroud)
我尝试了几种解决方案,包括这个,但它使我的应用程序即使在单击“显示图表”按钮后也不会显示图表。我上周开始学习 JS,所以很菜鸟......任何帮助将不胜感激。谢谢你!
您可以定义一个onClick
事件处理程序,但不幸的是,该事件处理程序的文档很少。在您的情况下,它看起来如下,onBarClicked
是您自己的函数,使用company
and调用category
。
options: {
...
onClick: event => {
const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
onBarClicked(model.datasetLabel, model.label);
}
}
Run Code Online (Sandbox Code Playgroud)
请查看下面修改后的代码:
options: {
...
onClick: event => {
const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
onBarClicked(model.datasetLabel, model.label);
}
}
Run Code Online (Sandbox Code Playgroud)
function onBarClicked(company, category) {
console.log('company = ' + company + ", category = " + category);
}
const default_colors = ['green', 'blue'];
function addGroupBarChart(data, labels) {
arr = []
data.forEach((d, i) => {
company = Object.keys(d)[0];
values = d[company]['data'];
dataset_company = {
label: company,
backgroundColor: default_colors[i],
data: values
};
arr.push(dataset_company);
});
let data_grouped = {
labels: labels,
datasets: arr
};
var chart = new Chart("bar-chart-group", {
type: "bar",
data: data_grouped,
options: {
title: {
display: false,
text: "Sentiment by category"
},
onClick: event => {
const datasetIndex = chart.getElementAtEvent(event)[0]._datasetIndex;
const model = chart.getElementsAtEvent(event)[datasetIndex]._model;
onBarClicked(model.datasetLabel, model.label);
}
}
});
}
const data = [{"Air France":{"data":[0.1, -0.2, 0.3, -0.1, 0.1]}},
{"Lufthansa":{"data":[0.3, -0.2, 0.5, 0.2, 0.1]}}];
const labels = ["company", "food", "luggage", "punctuality", "staff"];
addGroupBarChart(data, labels);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5903 次 |
最近记录: |