You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在独立函数中访问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

火山引擎 最新活动