基于 Highcharts 实现 Vue 中的答题统计柱状图组件

在现代 Web 开发中,数据可视化是一个重要的组成部分,而 Highcharts 是一个广泛使用的 JavaScript 图表库,可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中,我们将基于 Highcharts 创建一个用于答题统计的柱状图,并在 Vue.js 中进行集成。我们的目标是通过一个 Vue 组件显示答题正确数和错误数的柱状图,图表会根据外部数据进行动态更新。

1. 项目结构与需求分析

首先,需求是实现一个显示答题统计的柱状图。这个图表将有两个数据系列——正确答案数和错误答案数。每个题型(如单选、多选、判断等)将作为 X 轴的分类,而 Y 轴将表示每个题型的答对和答错的数量。为了满足这些需求,我们将使用 Highcharts 来生成图表,并通过 Vue.js 作为容器,管理和渲染数据。

效果:

2. 创建 Vue 组件

我们将首先创建一个 Vue 组件,该组件通过 chartData 属性接收外部传入的数据。这些数据包含了每个题型的答对和答错的数量。组件的结构包括图表容器以及用于初始化图表的 JavaScript 逻辑。

2.1. template 部分
<template><!-- 图表容器 --><div id="questionAnsweringStatistics"></div>
</template>

template 部分,我们创建了一个简单的容器 div,用来放置生成的图表。Highcharts 会将图表渲染到这个 div 中。

2.2. script 部分
import Highcharts from 'highcharts'

这行代码导入了 Highcharts 库,它是用来绘制图表的核心库。这里我们通过 import 语法导入 Highcharts,以便在组件中使用。

2.3. props 定义部分
props: {chartData: {type: Array,default: () => [ // 定义些一些假数据,展示使用{questionType: "1",rightNums: [1, 0, 0],nums: [3, 0, 0]},{questionType: "2",rightNums: [2, 0, 0],nums: [4, 0, 0]},{questionType: "3",rightNums: [0, 1, 0],nums: [0, 2, 0]},{questionType: "4",rightNums: [0, 2, 0],nums: [0, 2, 0]},{questionType: "5",rightNums: [0, 1, 0],nums: [0, 1, 0]},{questionType: "6",rightNums: [0, 0, 0],nums: [2, 0, 1]}]}
}
  • props 用来接收父组件传递的数据,这里的 chartData 是一个数组,包含题目类型的统计数据(rightNums 和 nums)。
  • chartData 是一个必须传递的数组,它包含了题目类型的统计信息。这样可以灵活地将不同的数据传递给图表组件进行动态渲染。
  • default 设置了默认值,以便便展示,一般设为空数组。如果父组件没有传递 chartData,则会使用这个默认数据来渲染图表。此数据格式与实际应用中的结构一致:rightNums 表示答对的题目数,nums 表示总题目数。
2.4. watch 监听 chartData 变化:
watch: {chartData: {handler(newVal) {newVal && this.initChart(newVal); // 数据变化时重新初始化图表},deep: true}
}
  • watch 用来监听 chartData 的变化,确保当父组件传递的数据发生变化时,我们能及时更新图表。
  • handler(newVal) 是一个回调函数,每当 chartData 更新时,它会被调用并传入新值 newVal,然后重新调用 initChart 渲染图表。
  • deep: true 是为了确保能够检测到对象内部属性的变化,防止 chartData 中的嵌套数据发生改变时无法触发更新。
2.5. mounted 生命周期钩子:
mounted() {this.chartData && this.initChart(this.chartData); // 组件挂载时初始化图表
}
  • 在 mounted 中,我们检查是否存在 chartData(即数据是否已传递到组件),如果存在则调用 initChart 方法初始化图表。
  • initChart 方法会将 chartData 数据传递进去,渲染图表。
2.6. processData 数据处理方法:
processData(data) {let name = [], error = [], success = []; // 题目类型,错误数,正确数data.forEach(item => {const totalQuestions = item.nums.reduce((pre, cur) => pre + cur, 0); // 总问题数if (totalQuestions > 0) {name.push(this.questionTypeFilter(item.questionType));  // 转换题目类型error.push(totalQuestions - item.rightNums.reduce((pre, cur) => pre + cur, 0)); // 计算错误数success.push(item.rightNums.reduce((pre, cur) => pre + cur, 0)); // 计算正确数}});return { name, error, success }; // 返回处理后的数据
}
  • processData 是数据预处理的核心函数。它对 chartData 中的每个数据项进行处理,提取出图表需要的数据。
  • name: 存储每个题型的名称(如“单选题”、“判断题”等)。这个名称来自 questionTypeFilter 方法的转换。
  • error 和 success: 分别存储每个题型的错误数和正确数。通过对 rightNums 和 nums 数组的累加计算得出。
  • reduce 是用来对数组求和的常用方法,这里通过它来计算每个题型的总数和正确数量。
  • 最终返回一个对象,包含 nameerrorsuccess,这三项数据是后续 Highcharts 渲染的基础。
2.7. questionTypeFilter 方法:
questionTypeFilter(num) {const typeMap = {'1': '单选','2': '多选','3': '判断','4': '阅文解答','5': '问答题','6': '填空题',};return typeMap[String(num)] || '未知类型'; // 默认为未知类型
}
  • questionTypeFilter 方法用于将题型编号转换为题型名称(例如,“1” 转换为 “单选”)。
  • typeMap 是一个映射对象,将题型编号与其对应的名称进行映射。
  • String(num) 将传入的 num 转为字符串类型,因为 typeMap 的键是字符串类型的。
  • 如果传入的题型编号没有匹配到 typeMap 中的任何键,则返回 '未知类型'
2.8. initChart 图表初始化:
initChart(data) {const { name, error, success } = this.processData(data); // 获取处理后的数据if (this.chart) {this.chart.destroy(); // 销毁旧的图表实例}const chartOptions = {chart: {type: 'column', // 设置柱状图类型backgroundColor: 'transparent', // 背景透明height: 380, // 图表高度},title: {text: '答题正确数', // 图表标题align: 'left',y: this.fontSize * 0.8, // 微调标题位置style: {fontSize: `${this.fontSize * 0.8}px`,fontWeight: 'bold', // 标题加粗},},xAxis: {categories: name, // X轴显示题目类型tickWidth: 0,lineColor: '#999', // 设置X轴线条颜色labels: {style: {fontSize: `${this.fontSize * 0.6}px`, // 设置X轴标签字体大小},},},yAxis: {min: 0, // Y轴从0开始title: { enabled: false }, // 关闭Y轴标题gridLineColor: '#999', // 设置网格线颜色},legend: {align: 'right',verticalAlign: 'top',floating: true, // 图例浮动itemStyle: {fontSize: `${this.fontSize * 0.6}px`, // 设置图例字体大小},},plotOptions: {column: {cursor: 'pointer', // 鼠标悬浮显示小手stacking: 'normal', // 堆叠柱状图dataLabels: {enabled: true, // 启用数据标签style: {textOutline: 'none', // 去掉文字外框fontSize: `${this.fontSize * 0.6}px`, // 设置数据标签字体大小},},},},series: [{name: '错误',color: 'rgb(247, 163, 92)', // 错误答案的颜色data: error, // 错误数据},{name: '正确',color: 'rgb(124, 181, 236)', // 正确答案的颜色data: success, // 正确数据},],credits: { enabled: false }, // 禁用版权信息exporting: { enabled: false }, // 禁用导出功能};this.chart = Highcharts.chart('questionAnsweringStatistics', chartOptions); // 渲染图表
}
  • initChart 方法用于初始化并渲染 Highcharts 图表。图表的配置项被详细定义在 chartOptions 中。
  • 首先,通过 this.processData(data) 获取处理后的数据,包括题目类型名称、正确数和错误数。
  • 如果已有图表实例(this.chart)存在,先销毁旧的图表实例,避免在页面中存在多个图表实例。
  • 图表配置项(chartOptions)包括了:
    • type: 'column':指定图表类型为柱状图。
    • title:设置图表标题及样式。
    • xAxis:设置 X 轴,显示题型名称(name)。
    • yAxis:设置 Y 轴,显示正确数和错误数。
    • legend:设置图例(正确、错误),以及图例样式。
    • series:设置数据系列,这里定义了两组数据:错误 和 正确,分别对应 error 和 success 数组。
  • 最后,通过 Highcharts.chart() 方法将配置项应用到图表,并渲染到页面中的 #questionAnsweringStatistics 容器中。

3. 总结:

代码的核心是通过 Highcharts 渲染动态柱状图,关键部分包括:

  • 数据预处理processData)和 题型转换questionTypeFilter),确保传递给图表的数据格式正确。
  • 图表初始化initChart),通过 Highcharts 配置项精细控制图表样式和显示效果。
  • 数据更新处理watch 和 mounted),确保当数据发生变化时,图表能及时更新。

如果有任何问题或改进建议,欢迎在评论区留言! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLAlchemyError: A transaction is already begun on this Session.

资料 sqlalchemy 事务 - 简书 在 SQLAlchemy 中&#xff0c;事务是通过会话来管理的。当你开始一个事务&#xff08;例如使用 async with db.begin()&#xff09;&#xff0c;它会开启一个新的事务&#xff0c;并在事务块结束时自动提交或回滚。如果在同一个会话中&#xff0c…

Java Web开发实战与项目——Spring Boot与Redis实现缓存管理

缓存技术在现代Web开发中至关重要&#xff0c;尤其是在高并发的环境中&#xff0c;缓存能够有效减少数据库访问压力、提高系统性能。Redis作为最流行的内存数据存储系统之一&#xff0c;常用于缓存管理。本节将讲解如何在Spring Boot项目中集成Redis&#xff0c;实现缓存管理&a…

C语言学习【1】C语言关于寄存器的封装

目录 1.封装寄存的C语言的语法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中&#xff0c;底层一定是操作寄存器&#xff0c;我有一个理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知识点融入自己的理解之中&…

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…

ollama 学习笔记

1. 参考博客&#xff1a;1. Ollama完整教程&#xff1a;本地LLM管理、WebUI对话、Python/Java客户端API应用&#xff1a;https://blog.csdn.net/python122_/article/details/1409457202. https://gitee.com/ai-big-model/ollama/tree/main --》REST APIollama 离线安装包 ollam…

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 万像素&#xff08;1600x1200&#xff09;。 输出格式&#xff1a;JPEG、YUV、RGB。 内置图像处理功能&#xff1a;自动曝…

vue2.x中父组件通过props向子组件传递数据详细解读

1. 父组件向子组件传递数据的步骤 在子组件中定义 props&#xff1a; 子组件通过 props 选项声明它期望接收的数据。props 可以是数组形式&#xff08;简单声明&#xff09;或对象形式&#xff08;支持类型检查和默认值&#xff09;。 在父组件中使用子组件时绑定 props&#x…

【Gin】2:快速上手Gin框架(模版、cookie、session)

本文目录 一、模版渲染二、自定义模版函数三、cookie四、Session五、cookie、session区别六、会话攻击 一、模版渲染 在 Gin 框架中&#xff0c;模板主要用于动态生成 HTML 页面&#xff0c;结合 Go 语言的模板引擎功能&#xff0c;实现数据与视图的分离。 模板渲染是一种动态…

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。专栏强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传

* BootStrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签&#xff0c;确认结构 3、通过自定义属性&#xff0c;控制弹框的显示和隐藏 其中的bootstrap.css…

数据结构:双链表list

list 是 C 标准库中的双向链表容器。 list初始化示例&#xff1a; #include <list>int n 7;std::list<int> lst; // 初始化一个空的双向链表 lststd::list<int> lst(n); // 初始化一个大小为 n 的链表 lst&#xff0c;链表中的值默认都为 0std::list<i…

AI Agent Service Toolkit:一站式大模型智能体开发套件

项目简介 该工具包基于LangGraph、FastAPI和Streamlit构建,提供了构建和运行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服务、用于与服务交互的客户端以及一个使用客户端提供聊天界面的Streamlit应用。用户可以利用该工具包提供的模板快速搭建基于LangGraph框架…

论文概览 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年10月第50卷第8期的论文的题目和摘要&#xff0c;一共包括21篇SCI论文&#xff01; 论文1 Advances in geospatial approaches to transport networks and sustainable mobility …

大语言模型推理能力从何而来?

前言 DeepSeek R1采用强化学习进行后训练&#xff0c;通过奖励机制和规则引导模型生成结构化思维链&#xff08;CoT&#xff09;&#xff0c;从而显著提升了推理能力。这一创新方法使得DeepSeek R1能够在无需大量监督数据的情况下&#xff0c;通过自我进化发展出强大的推理能力…

用 WOW.js 和 animate.css 实现动画效果

用 wow.js 就可以实现动画效果&#xff0c;但由于里面的动画样式太少&#xff0c;一般还会引入 animated.css 第一步&#xff1a;下载 选择合适的包管理器下载对应的内容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …

设计模式教程:解释器模式(Interpreter Pattern)

1. 什么是解释器模式&#xff1f; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;通常用于处理语言&#xff08;例如数学表达式、SQL查询等&#xff09;中的语法和解释。该模式定义了一个文法&#xff0c;并通过解释器类来解释文法中…

STM32MP157A单片机移植Linux驱动深入版

需求整理 在Linux设备树中新增leds节点&#xff0c;其有3个gpio属性&#xff0c;分别表示PE10对应led1&#xff0c;PF10对应led2&#xff0c;PE8对应led3&#xff0c;设备树键值对如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…

本地DeepSeek模型GGUF文件转换为PyTorch格式

接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…