基于 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?是用來對數組求和的常用方法,這里通過它來計算每個題型的總數和正確數量。
  • 最終返回一個對象,包含?name,?error,?success,這三項數據是后續 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.pswp.cn/news/896064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896064.shtml
英文地址,請注明出處:http://en.pswp.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模型進行訓練呢?今天我們就反其道而行之…