前端 | 数据统计及页面数据展现

文章目录

  • 📚实现效果
  • 📚模块实现解析
    • 🐇html
    • 🐇css
    • 🐇javascript

📚实现效果

  • 折线图分别展现当前累计单词总数及每篇新增单词数,鼠标悬浮读取具体数值。
    在这里插入图片描述
  • 数值统计
    在这里插入图片描述
  • 词云图展现,及点击查看大图
    在这里插入图片描述
    在这里插入图片描述

📚模块实现解析

🐇html

  • 搭框架
    <div class="count">
    	<div class="wordcount">
    	    <div id="cloudtitle">咱就是说,<span>成就感拉满</span></div>
    	    <div id="line"></div>
    	</div>  
    	<div id="totalcount"></div>
    	<div class="wordcount2">
    	    <div id="cloudtitle">单词们的词频<span>词云</span></div>
    	    <p style="font-size: 0.9vw; color: #575656;">电脑端点击可<span style="color: #ecbc41; font-size: 1vw;">查看大图</span></p>
    	    <div id="image">
    	        <img src="./images/wordcloud.png" 
    	        alt="词云图" 
    	        style="width:90%;
    	        aspect-ratio: 16/9; 
    	        border: 1.5px solid #ccc; 
    	        border-radius: 15px;" 
    	        onclick="showLargeImage(this)">
    	    </div>
    	</div>  
    </div>
    

🐇css

  • 主要是高亮字体的单独设置
    body{
        margin: 0;
        padding: 0;
        background-color: #f5f3f2;
    }
    
    .count{
        margin: 0 auto;
        /* background-color: pink; */
        position: absolute;
        left: 3%;
        top:8%;
        width: 28%;
        font-family: serif;
        font-size: 1.5vw;
        text-align: center;
    }
    .count span{
        font-size: 2vw;
        font-family: 'serif';
        color: #ecbc41;
        font-weight: bold;
    }
    #special{
        font-size: 1.8vw;
        color: #2966cf;
        font-weight: bold;
    }
    
    /* 标题 */
    #cloudtitle{
        margin: 0 auto;
        margin-top: 35px;
    }
    #cloudtitle span{
        font-size: 1.5vw;
        margin-bottom: 3px;
        font-weight: bold;
        color: #2966cf;
    }
    
    /* 折线图 */
    .wordcount{
        width: 100%;
        margin-top: -20px;
    }
    #line{
        width: 100%;
        height: 300px;
        top: -45px;
    }
    
    /* 数据统计 */
    #totalcount{
        width: 100%;
        margin-top: -20px;
    }
    
    /* 词云图 */
    .wordcount2{
        width: 100%;
        /* height: 280px; */
        margin-top: 30px;
    }
    #image{
        margin: 0 auto;
    }
    

🐇javascript

  • 导入数据及词云图,均来自于之前处理好后导出的数据文件。
  • 折线图部分,套用自可视化 | 【echarts】渐变条形+折线复合图
    var myChart = echarts.init(document.getElementById('line'));
    var request = new XMLHttpRequest();
    request.open('GET', './word_count.txt', true);
    
    request.onreadystatechange = function() {
        if (request.readyState === 4 && request.status === 200) {
            var rawText = request.responseText;
            var lines = rawText.split('\n');
            var TED = [];
            var counts = [];
            var diffCounts = [];
    
            // 解析每行的TED打卡号和单词数,并存入相应数组
            lines.forEach(function(line) {
                var data = line.split(' ');
                TED.push(data[0]);
                counts.push(parseInt(data[1], 10));
            });
    
            for (var i = 0; i < counts.length; i++) {
                if (i === 0) {
                    diffCounts.push(0); 
                } else {
                    diffCounts.push(counts[i] - counts[i - 1]);
                }
            }
    
            // 指定图表的配置项和数据
            var option = {
            tooltip: {
                trigger: 'axis',
                formatter: function (params) {
                    return '截至第' + params[0].name + '篇: ' + '单词数'+ params[0].value + '个<br/>' + '新增: ' + (params[1].value !== 0 ? params[1].value : '无数据');
                }
            },
            xAxis: {
                data: TED, 
                axisLine: {
                    lineStyle: {
                        color: '#151d29',
                        width: 2
                    }
                },
                axisLabel:{
                    textStyle: {
                        color: '#333', 
                        fontSize: 8, 
                    }
                }
            },
            yAxis: [
                {
                    type: 'value',
                    show: true,
                    interval: 400,
                    axisLine: {
                        lineStyle: {
                            color: '#151d29',
                            width: 2
                        }
                    },
                    axisLabel:{
                        textStyle: {
                            color: '#333', 
                            fontSize: 8, 
                        }
                    }
                },
                {
                    type: 'value', // 添加第二个Y轴
                    show: true,
                    interval: 400,
                    axisLine: {
                        lineStyle: {
                            color: '#151d29',
                            width: 2
                        }
                    },
                    axisLabel:{
                        textStyle: {
                            color: '#333', 
                            fontSize: 8, 
                        }
                    }
                }
            ],
            series: [
                {
                    type: 'line',
                    data: counts,
                    yAxisIndex: 0,
                    itemStyle: {
                        color: '#2966cf'
                    }
                },
                {
                    type: 'line', 
                    data: diffCounts, 
                    yAxisIndex: 1,
                    itemStyle: {
                        color: '#ecbc41' 
                    }
                },
                {
                    type: 'bar',
                    data: counts,
                    itemStyle: {
                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                            { offset: 0, color: '#aed0ee' },
                            { offset: 1, color: '#f6f9e4' }
                        ])
                    }
                }
            ],
            dataZoom: [
                {
                    show: true,
                    start: 0,
                    end: 100
                },
                {
                    type: 'inside',
                    start: 0,
                    end: 100
                }
            ]
        };
        myChart.setOption(option);
    }
    };
    
    request.send();
    
    window.addEventListener('resize', function() {
        myChart.resize();
    });
    
    • 注意到折线图最后有NaN空值,排查后发现是导入数据默认最后一行换行,有一行空数据。
      在这里插入图片描述
      在这里插入图片描述

    • 解决办法:

       lines.forEach(function(line) {
          var data = line.split(' ');
          // years.push(data[0]);
          // counts.push(parseInt(data[1], 10));
          // 排除引入数据最后的空行
          if (data.length === 2) {
              years.push(data[0]);
              counts.push(parseInt(data[1], 10));
          }
      });
      
    • 实现视口变化图表大小实时更新↓

      window.addEventListener('resize', function() {
          myChart.resize();
      });
      

  • 数据统计部分
    fetch('./output_word.json')
    .then(response => response.json())
    .then(data => {
        // 找到所有单词的 numbers 数组中的最大值,最大的文章编号即为总TED文章篇数
        let maxNumber = -Infinity;
        data.forEach(word => {
            let currentMax = Math.max(...word.numbers);
            if (currentMax > maxNumber) {
                maxNumber = currentMax;
            }
        });
        let totalTedArticles = maxNumber; 
        let totalUniqueWords = data.length;
        let mostFrequentWords = data.reduce((max, word) => {
            if (word.count > max[0].count) {
                max = [word];
            } else if (word.count === max[0].count) {
                max.push(word);
            }
            return max;
        }, [{ count: -Infinity }]);
    
        // 创建显示统计信息的元素
        const statsContainer = document.createElement('div');
        // 统计数据
        let highFrequentWords = data.filter(word => word.count > 3); // 高频词汇
        let mediumFrequentWords = data.filter(word => word.count >= 2 && word.count <= 3); // 中频词汇
        let lowFrequentWords = data.filter(word => word.count === 1); // 低频词汇
        statsContainer.innerHTML = `截至目前,<br><span id='special'>右一同学</span>已经阅读了<span>${totalTedArticles}</span>篇ted。<br><br>涉及到了<span>${totalUniqueWords}</span>个单词。假定出现三次以上为高频词,一次以上为中频词。<br><br>当前有高频词汇:<span id='special'>${highFrequentWords.length} </span>个,<br><br>中频词汇:<span id='special'>${mediumFrequentWords.length} </span>个,<br><br>低频词汇:<span id='special'>${lowFrequentWords.length}</span> 个。<br><br>其中梳理频次最多的单词是:<br>`; 
        mostFrequentWords.forEach((word, index) => {
            let text = `<br><span id='special'>"${word.word}"</span>,<br>出现了<span>${word.count}</span>次,在第<span>${word.numbers.join(', ')}</span>篇TED里都出现了。`
            if (index !== mostFrequentWords.length - 1) {
                text += '<br>';
            }
            statsContainer.innerHTML += text;
        });
    
        // 将统计信息添加到特定的 div 中
        const countContainer = document.getElementById('totalcount');
        countContainer.appendChild(statsContainer);
    })
    .catch(error => console.error('无法加载数据:', error));
    
    // 单击放大
    function showLargeImage(img) {
        var popup = window.open("", "_blank");
        // 在弹窗中显示原始大小的图片,并通过CSS样式使其居中显示
        popup.document.write('<style>body {display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;} img {max-width: 90%; max-height: 90%; object-fit: contain;}</style>');
        popup.document.write('<img src="' + img.src + '">');
    }
    
    • 找到所有TED打卡号的最大值,以得到TED文章的总篇数,然后统计单词总数以及高频词汇、中频词汇和低频词汇的数量,以及梳理频次最多的单词,并将统计信息应用到特定的div中。
    • showLargeImage实现单击图片时,在新窗口中打开,并居中显示。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在线旅游网站,基于 SpringBoot+Vue+MySQL 开发的前后端分离的在线旅游网站设计实现

目录 一. 前言 二. 功能模块 2.1. 登录界面 2.2. 管理员功能模块 2.3. 用户功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然…

Error: Maximum response size reached

错误原因复现 请求下载的文件是4g的&#xff0c;postman报错Error: Maximum response size reached 解决办法 Postman设置请求时长和数据大小 Settings&#xff0c;打开设置面板 postman有默认请求时间&#xff0c;正常的postman请求后端少量数据&#xff0c;返回特别快。但…

美颜滤镜SDK解决方案,稳定可靠,易于集成

高质量的视觉体验已成为企业吸引用户、提升品牌形象的关键&#xff0c;美摄科技凭借其领先的美颜滤镜SDK技术&#xff0c;为企业提供了从人像美颜到多元场景处理的全方位解决方案&#xff0c;助力企业轻松实现视觉升级。 一、强大能力&#xff0c;覆盖多场景 美摄科技美颜滤镜…

洪水仿真模拟(ArcGIS),水利数字孪生新利器

这两天ArcGIS Pro的官方账号释放了一个名为“Flood Simulation in ArcGIS Pro”的洪水模拟功能视频。根据视频详情页的介绍&#xff0c;该洪水仿真模拟功能会作为新功能出现在ArcGIS Pro 3.3中。 由于我目前从事的主要应用方向都是弱GIS的领域&#xff0c;所以我已经很久没有再…

无线收发模块家电控制实验

zkhengyang可申请加入数字音频系统研究开发交流答疑群(课题组) 当然可以先用固定电平发送&#xff0c;可以实现&#xff0c;0/1数据发送&#xff0c;接收。 可以使用51单片机来编码码&#xff0c;解码&#xff0c;或者任何MCU或者SOC&#xff0c;DSP&#xff0c;FPGA。 注意G…

银河麒麟操作系统 v10 离线安装 Docker v20.10.9

1查看系统版本 [rootweb-0001 ~]# cat /etc/os-release NAME"Kylin Linux Advanced Server" VERSION"V10 (Tercel)" ID"kylin" VERSION_ID"V10" PRETTY_NAME"Kylin Linux Advanced Server V10 (Tercel)" ANSI_COLOR"…

OBS插件--自定义着色器

自定义着色器 自定义着色器是一个滤镜插件&#xff0c;可以用于源和场景。插件自带一百多款滤镜效果&#xff0c;支持自己编写效果代码。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在插件中心左侧导航栏&#xff0c;选择 滤镜 项&#xff0c;然…

在go-zero中使用jwt

gozero使用jwt 两个步骤 获取token验证token 前端获取token 先编写 jwt.api 文件&#xff0c;放在api目录下 syntax "v1"info (title: "type title here"desc: "type desc here"author: "type author here"email: &quo…

经常睡不好觉?试试用上华为手环9新升级的睡眠监测功能

睡眠问题是不是经常困扰着你呢&#xff1f;听说&#xff0c;华为手环9的睡眠监测功能升级了&#xff0c;无论是入睡前、睡眠中还是睡醒后&#xff0c;都能够帮助我们改善睡眠&#xff0c;让我们告别糟糕的睡眠质量&#xff01; 睡觉前&#xff0c;打开华为手环9的睡眠模式&…

二值信号量、计数型信号量与互斥量

二值信号量 什么是信号量? 信号量(Semaphore),是在多任务环境下使用的一种机制,是可以用来保证两个或多个关键代码段不被并发调用。 信号量这个名字,我们可以把它拆分来看,信号可以起到通知信号的作用,然后我们的量还可以用来表示资源的数量,当我们的量只有0和1的时…

1.基于python的单细胞数据预处理-特征选择

文章目录 特征选择背景基于基因离散度基于基因归一化方差基于基因皮尔森近似残差特征选择总结 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 特征选择背景 现在已经获得了经过…

企业微信集成H5授权登录相关知识(二)

流程&#xff1a; 1.前端请求企业微信获取code&#xff1a;官网网页授权链接 2.企业微信返回的code请求后端判断是否已绑定系统账户 3.后端根据企业微信code&#xff0c;accessToken获得userId 4.userId获取user进行oauth2授权方式进行免密登录 相关知识&#xff1a; 一&a…

初阶数据结构—顺序表和链表

第一章&#xff1a;线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就…

土壤墒情自动监测站—墒情异常数据报警提示

TH-TS600土壤墒情自动监测站通常配备有预警提示功能&#xff0c;用于在墒情出现异常情况时及时向用户发出警告。这一功能对于农业生产至关重要&#xff0c;因为它可以帮助农民或农田管理者及时发现土壤墒情的变化&#xff0c;并采取相应的措施来确保作物健康生长。 土壤墒情自动…

Redis之Stream流

reidis为了抢占市场份额&#xff0c;推出了自己的消息队列&#xff0c;Stream流&#xff0c; 常用操作如下&#xff1a; xadd name id值 key value key1 value1...&#xff1a;若不存在为name的stream流&#xff0c;则创建一个新的名为name的stream流。这里id相当于数据库中的…

修改ollama模型文件下载位置

修改ollama模型文件下载位置。你如果不改这个东西&#xff0c;所有的模型文件都会下到c盘&#xff0c;土豪随意。 这里修改环境变量&#xff1a; OLLAMA_MODELS将这个环境变量设置为你想存放的路径。然后重启电脑&#xff01;

鹦鹉优化算法原理及代码实现

鹦鹉(Pyrrhura Molinae)表现出四种不同的行为特征&#xff1a;觅食、停留、交流和对陌生人的恐惧。这些行为(如图1所示)在现实环境中构成了我们设计PO动机的基础。 觅食&#xff1a;驯化的鹦鹉(Pyrrhura Molinae)的觅食行为令人着迷&#xff0c;因为个体选择在食物丰富的小群体…

Leetcode—239. 滑动窗口最大值【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—239. 滑动窗口最大值 算法思想 用vector会超时的&#xff0c;用deque最好&#xff01; 实现代码 class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> …

PCIE学习(2)PCIE配置空间详解

文章目录 前言一、配置空间header二、Base Address register&#xff08;BAR&#xff09;2.1、BAR是干什么的2.2、具体实现过程BAR示例1——32bit内存地址空间请求BAR示例2——64bit内存地址空间请求 前言 图片来自&#xff1a;https://zhuanlan.zhihu.com/p/463518877 一、…

【Linux网络编程】I/O多路转接之select

select 1.初识select2.了解select基本概念和接口介绍3.select服务器4.select特点及优缺点总结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603;…