如何在独立函数中访问Microsoft Emotion API情绪分数以绘制折线图
如何在独立函数中访问情绪分数以绘制折线图?
其实解决这个问题很简单,核心就是把API返回的scores数据传递给make_graph函数,或者把数据存到一个能被make_graph访问到的地方。这里给你两种最常用的方案,优先推荐第一种,更符合代码模块化的原则:
方案1:直接将scores作为参数传递给make_graph
这是最清晰、最不容易出问题的方式,不需要依赖全局变量。你只需要在获取到scores数据后,直接调用make_graph并把scores传进去就行:
修改你的done回调代码:
.done(function(data) { // 保留原有的面部矩形处理代码 var faceRectangle = data[0].faceRectangle; var faceRectangleList = $('#faceRectangle'); var data1=""; for (var prop in faceRectangle) { data1 += "<li> " + prop + ": " + faceRectangle[prop] + "</li>"; } faceRectangleList.html(data1); // 情绪分数处理部分 var scores = data[0].scores; var scoresList = $('#scores'); var data2=""; for(var prop in scores) { data2 += "<li> " + prop + ": " + scores[prop] + "</li>"; } scoresList.html(data2); // 关键:获取到scores后立刻调用make_graph并传入数据 make_graph(scores); }).fail(function(err) { alert("Error: " + JSON.stringify(err)); });
然后修改make_graph函数接收参数:
function make_graph(scores) { // 现在你可以直接访问每个单独的情绪分数了! const anger = scores.anger; const happiness = scores.happiness; const neutral = scores.neutral; const sadness = scores.sadness; // 其他情绪比如contempt、disgust、fear、surprise同理 // 如果需要把所有情绪整理成图表需要的格式(比如x轴是情绪名称,y轴是分数) const emotionNames = Object.keys(scores); // 拿到所有情绪名称数组 const emotionScores = Object.values(scores); // 拿到对应的分数数组 // 这里就可以用这些数据绘制折线图了,比如用Chart.js的示例逻辑(你可以换成自己用的绘图库): // const chartCtx = document.getElementById('emotionLineChart').getContext('2d'); // new Chart(chartCtx, { // type: 'line', // data: { // labels: emotionNames, // datasets: [{ // label: '情绪置信度', // data: emotionScores, // borderColor: '#2196F3', // fill: false, // tension: 0.2 // }] // } // }); }
方案2:使用全局变量存储scores(不推荐,但适合快速测试)
如果你暂时不想修改函数调用方式,可以把scores存到一个全局变量里,这样make_graph就能直接访问到:
先在全局作用域定义变量:
// 在所有函数外面定义全局变量 let emotionScores = null;
在done回调里给全局变量赋值:
.done(function(data) { // ... 保留所有原有代码 ... var scores = data[0].scores; // 赋值给全局变量 emotionScores = scores; // 调用make_graph make_graph(); })
修改make_graph函数使用全局变量:
function make_graph() { // 先判断数据是否存在 if (!emotionScores) { alert("还没有获取到情绪检测数据!"); return; } // 访问单独的分数 const surprise = emotionScores.surprise; const fear = emotionScores.fear; // 后续绘图逻辑... }
注意:全局变量尽量少用,因为容易和其他代码产生命名冲突,代码维护起来也更麻烦,优先用方案1。
内容的提问来源于stack exchange,提问作者Talha Mahmood




