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

📚实现效果

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

📚模块实现解析

🐇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实现单击图片时,在新窗口中打开,并居中显示。
ECharts 是一款由百度开发的、基于 JavaScript 的开源数据可视化库,它提供了丰富的图表类型和高度的可定制性,以帮助开发者轻松创建交互性强、美观且响应迅速的数据可视化界面。ECharts 支持在各种现代浏览器(包括移动设备上的浏览器)以及部分旧版浏览器(如 IE8/9/10/11)中运行,其底层依赖轻量级矢量图形库 ZRender,确保了图表渲染的高效性和跨平台兼容性。 以下是一些关于使用 ECharts 进行数据可视化的关键特性、图表类型和基本使用步骤: ### 关键特性 1. **开源免费**:ECharts 是开源软件,可以免费用于个人和商业项目,无需支付任何费用。 2. **广泛兼容**:支持多种浏览器环境,包括但不限于 Chrome、Firefox、Safari 和 Internet Explorer 系列,保证在不同设备和操作系统上的良好表现。 3. **丰富图表类型**:包括但不限于折线图、柱状图、散点图、饼图、K线图、盒形图、地图、热力图、线图、关系图、treemap、旭日图、平行坐标、漏斗图、仪表盘等,以及三维可视化组件(通过 ECharts GL 扩展)。 4. **交互性强**:图表支持鼠标悬停提示、数据区域缩放、图表联动、图表堆叠、数据过滤、图例开关等多种交互功能,提升用户对数据的探索和理解能力。 5. **个性化定制**:提供详细的配置选项,允许用户自定义图表的颜色、字体、网格线、图例、tooltip、轴标签、数据标签、动画效果等,以满足特定设计需求和品牌风格。 6. **数据更新动态渲染**:能够实时接收新数据并动态更新图表,适用于数据流或实时监控场景。 7. **扩展性**:除了核心库外,有 ECharts GL 用于三维和大规模地理数据可视化,以及周边生态工具(如 ECharts-GL、ZRender)增强其功能和适用范围。 ### 图表类型 ECharts 提供的图表类型涵盖了数据分析和展示的常见需求,包括: - **基础图表**:折线图、柱状图、散点图、饼图、K线图 - **统计图表**:盒形图 - **地理图表**:地图、热力图、线图 - **关系图表**:关系图、treemap、旭日图 - **多维数据可视化**:平行坐标 - **BI图表**:漏斗图、仪表盘 此外,ECharts 支持图表间的混搭,即在一个图表容器内同时展现多种图表类型,以对比或关联不同数据维度。 ### 使用步骤 使用 ECharts 进行数据可视化的一般步骤如下: #### 1. 引入 ECharts 库 在 HTML 文件中通过 `<script>` 标签引入 ECharts 的核心文件: ```html <script src="https://cdn.jsdelivr.net/npm/echarts@版本号/dist/echarts.min.js"></script> ``` 确保替换 `版本号` 为所需的 ECharts 版本。 #### 2. 准备 DOM 容器 在页面上创建一个用于承
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦右一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值