大数据可视化大屏实战项目(8)史上最炫酷科技风销售额度展示大屏,适用于电子产品---HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中)

news2024/12/23 23:05:05

大数据可视化大屏实战项目(8)史上最炫酷科技风销售额度展示大屏,适用于电子产品—HTML+CSS+JS【源码在文末】(可用于比赛项目或者作业参考中🐕🐕🐕)

一,项目概览

☞☞☞☞☞☞项目演示链接:http://59.110.22.223:8080/Data/8/

☞☞☞☞☞☞项目演示链接:http://59.110.22.223:8080/Data/8/
image-20230904095404447

image-20230904095414795

image-20230904095428819

二,运行视频

☞☞☞☞☞☞B站演示视频:https://www.bilibili.com/video/BV1Jz4y1T7gZ/

三,部分代码讲解

$(function () {
    // 初始化界面
    function init() {
        placeholderPic()
        sd1('.sd1')
        sd1('.sd2')
        sd2('.sd3')
        sd2('.sd4')
        jz()
        animate()
    }
    init()

    // 自定义字体大小
    function placeholderPic() {
        w = document.documentElement.clientWidth / 80;
        document.documentElement.style.fontSize = w + 'px';
    }

    // 闪电一,二
    function sd1(ele) {
        var width, height
        var step = 0;
        var canvas = document.createElement('canvas')
        var ctx = canvas.getContext('2d')

        var bg = [4, 10, 11]
        document.querySelector(ele).appendChild(canvas)
        setTimeout(() => {
            var timeID = setInterval(() => {
                pt1.x += 10;
                if (pt1.x > width - 10) {
                    clearInterval(timeID)
                }
            }, 60);
        }, 1000)

        var pt1
        var pt2

        window.addEventListener('resize', setup)

        setup()

        function setup() {
            canvas.width = width = document.querySelector(ele).clientWidth
            canvas.height = height = document.querySelector(ele).clientHeight

            ctx.beginPath();
            ctx.rect(0, 0, width, height)
            ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${1})`
            ctx.fill()

            pt1 = { x: -20, y: height / 2 }//闪电起点
            pt2 = { x: -20, y: height / 2 } //闪电终点
            // draw()
        }

        setInterval(animate, 60)
        // window.requestAnimationFrame(animate);

        function blur(ctx, canvas, amt) {
            ctx.filter = `blur(${amt}px)`
            ctx.drawImage(canvas, 0, 0)
            ctx.filter = 'none'
        }

        function fade(ctx, amt, width, height) {
            ctx.beginPath();
            ctx.rect(0, 0, width, height)
            ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${amt})`
            ctx.fill()
        }

        function animate() {
            step++

            blur(ctx, canvas, 1)
            draw()
            fade(ctx, 0.1, width, height)

            // window.requestAnimationFrame(function(){animate()})
        }

        function draw() {

            var iterations = [pt1, pt2]
            var newiterations, i, j
            for (i = 0; i < 8; i++) {
                newiterations = [iterations[0]]
                for (j = 1; j < iterations.length; j++) {
                    newiterations.push(getRandMidpoint(iterations[j - 1], iterations[j], 200 / (i * i + 1)))
                    newiterations.push(iterations[j])
                }
                iterations = newiterations.concat([])
            }
            ctx.beginPath();
            ctx.moveTo(iterations[0].x, iterations[0].y);
            ctx.lineWidth = 2;
            ctx.strokeStyle = '#04e4c9';
            // ctx.strokeStyle = `hsla(${Math.sin( step / 30) * 120 + 50},${90}%,${70}%,1)`
            for (i = 1; i < iterations.length; i++) {
                ctx.lineTo(iterations[i].x, iterations[i].y);
            }
            ctx.stroke()
            ctx.closePath()
        }

        function getRandMidpoint(pa, pb, range) {
            var a = Math.atan2(pb.y - pa.y, pb.x - pa.x) + Math.PI / 2
            var half = { y: (pb.y - pa.y) / 2 + pa.y, x: (pb.x - pa.x) / 2 + pa.x }
            var offset = Math.random() * range / 3 - range / 6  //这里控制闪电的抖动幅度
            var ho = {
                x: Math.cos(a) * offset + half.x,
                y: Math.sin(a) * offset + half.y
            }
            return ho
        }
    }


    //
    //
    //

    // 闪电三,四
    function sd2(ele) {
        var width, height
        var step = 0;
        var canvas = document.createElement('canvas')
        var ctx = canvas.getContext('2d')

        var bg = [4, 10, 11]
        document.querySelector(ele).appendChild(canvas)
        setTimeout(() => {
            var timeID = setInterval(() => {
                pt1.x -= 10;
                if (pt1.x < 10) {
                    clearInterval(timeID)
                }
            }, 60);
        }, 1000)

        var pt1
        var pt2

        window.addEventListener('resize', setup)

        setup()

        function setup() {
            canvas.width = width = document.querySelector(ele).clientWidth
            canvas.height = height = document.querySelector(ele).clientHeight

            ctx.beginPath();
            ctx.rect(0, 0, width, height)
            ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${1})`
            ctx.fill()

            pt1 = { x: width + 20, y: height / 2 }//闪电起点
            pt2 = { x: width + 20, y: height / 2 } //闪电终点
            // draw()
        }

        setInterval(animate, 60)
        // window.requestAnimationFrame(animate);

        function blur(ctx, canvas, amt) {
            ctx.filter = `blur(${amt}px)`
            ctx.drawImage(canvas, 0, 0)
            ctx.filter = 'none'
        }

        function fade(ctx, amt, width, height) {
            ctx.beginPath();
            ctx.rect(0, 0, width, height)
            ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${amt})`
            ctx.fill()
        }

        function animate() {
            step++

            blur(ctx, canvas, 1)
            draw()
            fade(ctx, 0.1, width, height)

            // window.requestAnimationFrame(function(){animate()})
        }

        function draw() {

            var iterations = [pt1, pt2]
            var newiterations, i, j
            for (i = 0; i < 8; i++) {
                newiterations = [iterations[0]]
                for (j = 1; j < iterations.length; j++) {
                    newiterations.push(getRandMidpoint(iterations[j - 1], iterations[j], 200 / (i * i + 1)))
                    newiterations.push(iterations[j])
                }
                iterations = newiterations.concat([])
            }
            ctx.beginPath();
            ctx.moveTo(iterations[0].x, iterations[0].y);
            ctx.lineWidth = 2;
            ctx.strokeStyle = '#04e4c9';
            // ctx.strokeStyle = `hsla(${Math.sin( step / 30) * 120 + 50},${90}%,${70}%,1)`
            for (i = 1; i < iterations.length; i++) {
                ctx.lineTo(iterations[i].x, iterations[i].y);
            }
            ctx.stroke()
            ctx.closePath()
        }

        function getRandMidpoint(pa, pb, range) {
            var a = Math.atan2(pb.y - pa.y, pb.x - pa.x) + Math.PI / 2
            var half = { y: (pb.y - pa.y) / 2 + pa.y, x: (pb.x - pa.x) / 2 + pa.x }
            var offset = Math.random() * range / 3 - range / 6  //这里控制闪电的抖动幅度
            var ho = {
                x: Math.cos(a) * offset + half.x,
                y: Math.sin(a) * offset + half.y
            }
            return ho
        }
    }

    // 加载动画
    function jz() {
        $('.jz1 ul li').each((index, item) => {
            item.style.opacity = 1 - index / 10;
        })
        setInterval(() => {
            $('.jz1 ul li').each((index, item) => {
                if (item.style.opacity == 0) {
                    item.style.opacity = 1
                }
                item.style.opacity = parseFloat(item.style.opacity) - 0.1
            })
        }, 100)
        $('.jz2 ul li').each((index, item) => {
            item.style.opacity = 1 - index / 10;
        })
        setInterval(() => {
            $('.jz2 ul li').each((index, item) => {
                if (item.style.opacity == 0) {
                    item.style.opacity = 1
                }
                item.style.opacity = parseFloat(item.style.opacity) - 0.1
            })
        }, 100)
    }

    // 中间背景动画
    function animate() {
        var App = {};
        App.setup = function () {
          // 创建canvas元素,并加入body中
          var canvas = document.createElement('canvas');
          this.filename = "spipa";
          // 控制canvas幕布的大小
          canvas.width = document.querySelector('.animate').clientWidth;
          canvas.height = document.querySelector('.animate').clientHeight;
          this.canvas = canvas;
          document.querySelector('.animate').appendChild(canvas);
          this.ctx = this.canvas.getContext('2d');
          this.width = this.canvas.width;
          this.height = this.canvas.height;
          this.dataToImageRatio = 1;
          this.ctx.imageSmoothingEnabled = false;
          this.ctx.webkitImageSmoothingEnabled = false;
          this.ctx.msImageSmoothingEnabled = false;
          this.xC = this.width / 2;
          this.yC = this.height / 2;
    
          this.stepCount = 0;
          this.particles = [];
          this.lifespan = 1000;
          this.popPerBirth = 1;
          this.maxPop = 200;
          this.birthFreq = 5;
    
          // Build grid
          this.gridSize = 8;// 运动坐标
          this.gridSteps = Math.floor(1000 / this.gridSize);
          this.grid = [];
          var i = 0;
          for (var xx = -500; xx < 500; xx += this.gridSize) {
            for (var yy = -500; yy < 500; yy += this.gridSize) {
              // 径向场,r的三角函数,最大值在r0附近
              var r = Math.abs(xx) + Math.abs(yy),//Math.sqrt(xx*xx+yy*yy),
                r0 = 3*w, //中间方形的大小
                field;
    
              if (r < r0) field = 255 / r0 * r;
              else if (r > r0) field = 255 - Math.min(255, (r - r0) / 2);
    
              this.grid.push({
                x: xx,
                y: yy,
                busyAge: 0,
                spotIndex: i,
                isEdge: (xx == -500 ? 'left' :
                  (xx == (-500 + this.gridSize * (this.gridSteps - 1)) ? 'right' :
                    (yy == -500 ? 'top' :
                      (yy == (-500 + this.gridSize * (this.gridSteps - 1)) ? 'bottom' :
                        false
                      )
                    )
                  )
                ),
                field: field
              });
              i++;
            }
          }
          this.gridMaxIndex = i;
    
    
    
          this.initDraw();
        };
        App.evolve = function () {
          var time1 = performance.now();
    
          this.stepCount++;
    
          // Increment all grid ages
          this.grid.forEach(function (e) {
            if (e.busyAge > 0) e.busyAge++;
          });
    
          if (this.stepCount % this.birthFreq == 0 && (this.particles.length + this.popPerBirth) < this.maxPop) {
            this.birth();
          }
          App.move();
          App.draw();
    
          var time2 = performance.now();
    
    
    
        };
        App.birth = function () {
          var x, y;
          var gridSpotIndex = Math.floor(Math.random() * this.gridMaxIndex),
            gridSpot = this.grid[gridSpotIndex],
            x = gridSpot.x, y = gridSpot.y;
    
          var particle = {
            hue: -10,// + Math.floor(50*Math.random()),
            sat: 95,//30 + Math.floor(70*Math.random()),
            lum: 20 + Math.floor(40 * Math.random()),
            x: x, y: y,
            xLast: x, yLast: y,
            xSpeed: 0, ySpeed: 0,
            age: 0,
            ageSinceStuck: 0,
            attractor: {
              oldIndex: gridSpotIndex,
              gridSpotIndex: gridSpotIndex,// Pop at random position on grid
            },
            name: 'seed-' + Math.ceil(10000000 * Math.random())
          };
          this.particles.push(particle);
        };
        App.kill = function (particleName) {
          var newArray = _.reject(this.particles, function (seed) {
            return (seed.name == particleName);
          });
          this.particles = _.cloneDeep(newArray);
        };
        App.move = function () {
          for (var i = 0; i < this.particles.length; i++) {
            // Get particle
            var p = this.particles[i];
    
            // Save last position
            p.xLast = p.x; p.yLast = p.y;
    
            // Attractor and corresponding grid spot
            var index = p.attractor.gridSpotIndex,
              gridSpot = this.grid[index];
    
            // Maybe move attractor and with certain constraints
            if (Math.random() < 0.5) {
              // Move attractor
              if (!gridSpot.isEdge) {
                // Change particle's attractor grid spot and local move function's grid spot
                var topIndex = index - 1,
                  bottomIndex = index + 1,
                  leftIndex = index - this.gridSteps,
                  rightIndex = index + this.gridSteps,
                  topSpot = this.grid[topIndex],
                  bottomSpot = this.grid[bottomIndex],
                  leftSpot = this.grid[leftIndex],
                  rightSpot = this.grid[rightIndex];
    
                // Choose neighbour with highest field value (with some desobedience...)
                var chaos = 30;
                var maxFieldSpot = _.maxBy([topSpot, bottomSpot, leftSpot, rightSpot], function (e) {
                  return e.field + chaos * Math.random()
                });
    
                var potentialNewGridSpot = maxFieldSpot;
                if (potentialNewGridSpot.busyAge == 0 || potentialNewGridSpot.busyAge > 15) {// Allow wall fading
                  //if (potentialNewGridSpot.busyAge == 0) {// Spots busy forever
                  // Ok it's free let's go there
                  p.ageSinceStuck = 0;// Not stuck anymore yay
                  p.attractor.oldIndex = index;
                  p.attractor.gridSpotIndex = potentialNewGridSpot.spotIndex;
                  gridSpot = potentialNewGridSpot;
                  gridSpot.busyAge = 1;
                } else p.ageSinceStuck++;
    
              } else p.ageSinceStuck++;
    
              if (p.ageSinceStuck == 10) this.kill(p.name);
            }
    
            // Spring attractor to center with viscosity
            var k = 8, visc = 0.4;
            var dx = p.x - gridSpot.x,
              dy = p.y - gridSpot.y,
              dist = Math.sqrt(dx * dx + dy * dy);
    
            // Spring
            var xAcc = -k * dx,
              yAcc = -k * dy;
    
            p.xSpeed += xAcc; p.ySpeed += yAcc;
    
            // Calm the f*ck down
            p.xSpeed *= visc; p.ySpeed *= visc;
    
            // Store stuff in particle brain
            p.speed = Math.sqrt(p.xSpeed * p.xSpeed + p.ySpeed * p.ySpeed);
            p.dist = dist;
    
            // Update position
            p.x += 0.1 * p.xSpeed; p.y += 0.1 * p.ySpeed;
    
            // Get older
            p.age++;
    
            // Kill if too old
            if (p.age > this.lifespan) {
              this.kill(p.name);
              this.deathCount++;
            }
          }
        };
        App.initDraw = function () {
          this.ctx.beginPath();
          this.ctx.rect(0, 0, this.width, this.height);
          this.ctx.fillStyle = 'transparent';
          this.ctx.fill();
          this.ctx.closePath();
        };
    
        App.draw = function () {
          this.drawnInLastFrame = 0;
          if (!this.particles.length) return false;
    
          this.ctx.beginPath();
          this.ctx.rect(0, 0, this.width, this.height);
          // this.ctx.fillStyle = 'transparent';
          this.ctx.fillStyle = 'rgba(12, 22, 25, 0.1)';
          this.ctx.fill();
          this.ctx.closePath();
          for (var i = 0; i < this.particles.length; i++) {
            // Draw particle
            var p = this.particles[i];
    
            var h, s, l, a;
    
            h = p.hue + this.stepCount / 30;
            s = p.sat;
            l = p.lum;
            a = 1;
    
            var last = this.dataXYtoCanvasXY(p.xLast, p.yLast),
              now = this.dataXYtoCanvasXY(p.x, p.y);
            var attracSpot = this.grid[p.attractor.gridSpotIndex],
              attracXY = this.dataXYtoCanvasXY(attracSpot.x, attracSpot.y);
            var oldAttracSpot = this.grid[p.attractor.oldIndex],
              oldAttracXY = this.dataXYtoCanvasXY(oldAttracSpot.x, oldAttracSpot.y);
    
            this.ctx.beginPath();
    
            this.ctx.strokeStyle = 'green';
            this.ctx.fillStyle = 'hsla(' + h + ', ' + s + '%, ' + l + '%, ' + a + ')';
    
            // Particle trail
            this.ctx.moveTo(last.x, last.y);
            this.ctx.lineTo(now.x, now.y);
    
            this.ctx.lineWidth = 1.5 * this.dataToImageRatio;
            this.ctx.stroke();
            this.ctx.closePath();
    
            // Attractor positions
            this.ctx.beginPath();
            this.ctx.lineWidth = 1.5 * this.dataToImageRatio;
            this.ctx.moveTo(oldAttracXY.x, oldAttracXY.y);
            this.ctx.lineTo(attracXY.x, attracXY.y);
            this.ctx.arc(attracXY.x, attracXY.y, 1.5 * this.dataToImageRatio, 0, 2 * Math.PI, false);
    
            //a /= 20;
            this.ctx.strokeStyle = 'green';
            this.ctx.fillStyle = 'green';
            //this.ctx.stroke();
            this.ctx.fill();
    
            this.ctx.closePath();
    
            // UI counter
            this.drawnInLastFrame++;
          }
    
        };
        App.dataXYtoCanvasXY = function (x, y) {
          var zoom = 1.6;
          var xx = this.xC + x * zoom * this.dataToImageRatio,
            yy = this.yC + y * zoom * this.dataToImageRatio;
    
          return { x: xx, y: yy };
        };
    
        setTimeout(function(){
            console.log(1123)
            App.setup();
            App.draw();
      
            var frame = function () {
              App.evolve();
              requestAnimationFrame(frame);
            };
            frame();
        },5000)
    
    
        /**
         * Some old util I use at times
         *
         * @param {Number} Xstart X value of the segment starting point
         * @param {Number} Ystart Y value of the segment starting point
         * @param {Number} Xtarget X value of the segment target point
         * @param {Number} Ytarget Y value of the segment target point
         * @param {Boolean} realOrWeb true if Real (Y towards top), false if Web (Y towards bottom)
         * @returns {Number} Angle between 0 and 2PI
         */
        segmentAngleRad = function (Xstart, Ystart, Xtarget, Ytarget, realOrWeb) {
          var result;// Will range between 0 and 2PI
          if (Xstart == Xtarget) {
            if (Ystart == Ytarget) {
              result = 0;
            } else if (Ystart < Ytarget) {
              result = Math.PI / 2;
            } else if (Ystart > Ytarget) {
              result = 3 * Math.PI / 2;
            } else { }
          } else if (Xstart < Xtarget) {
            result = Math.atan((Ytarget - Ystart) / (Xtarget - Xstart));
          } else if (Xstart > Xtarget) {
            result = Math.PI + Math.atan((Ytarget - Ystart) / (Xtarget - Xstart));
          }
    
          result = (result + 2 * Math.PI) % (2 * Math.PI);
    
          if (!realOrWeb) {
            result = 2 * Math.PI - result;
          }
    
          return result;
        }
    }
})

这段代码是一个使用HTML、CSS和JavaScript编写的网页动画效果。代码的主要目的是在网页上创建闪电和其他一些动画效果。让我一步步解释代码的主要部分:

  1. 首先,在文档准备好后(即DOM加载完成后),通过$(function () {...})这段代码创建了一个jQuery的ready函数,用于执行初始化函数init()

  2. init()函数用于初始化整个界面。在该函数中,它调用了一系列其他函数来创建并设置不同的动画效果。

  3. placeholderPic()函数用于自定义页面的字体大小,根据视窗宽度来调整字体大小。

  4. sd1()sd2()函数用于创建闪电效果。这两个函数非常相似,它们创建了一个HTML5 Canvas元素,并在其上绘制闪电形状的动画。每个函数都包括了一些子函数,用于绘制、模糊和动画化闪电效果。这些闪电效果是通过一系列的点连接而成的,每次调用animate()函数都会更新闪电效果的位置。

  5. jz()函数用于加载动画效果。它通过操作CSS属性来实现元素的淡入淡出效果。

  6. 最后,animate()函数是一个中间背景动画的主要部分。它使用HTML5 Canvas来创建一个粒子系统,粒子受到吸引点和斥力点的影响,从而形成动态效果。这部分的代码涉及了粒子的移动、绘制和更新,以及一些计算来控制粒子的行为。

总的来说,这段代码的主要目的是创建一个包含多个不同动画效果的网页,包括闪电、淡入淡出的元素以及中间背景的粒子动画效果。这些动画效果是通过HTML5 Canvas和一些JavaScript函数来实现的。此外,代码还使用了jQuery库来处理页面的加载和元素操作。如果你有特定的问题或需要更详细的解释,请提出。

可视化图表的使用技巧

1、柱状图

柱状图中的颜色尽量不要超过3种。
柱状图柱子间的宽度和间隙要是适当。住在太窄,用户的视觉可能会集中在两个柱子之间的负空间
对多个数据系列排序时,最好复合一定的逻辑,用直观的方式引导用户更好的查看数据,此时可以通过升序和降序排列。
2、折线图

折线图连接各点可以使用直线和曲线,这样更美观,数据展示更加清晰
折线的颜色要清晰,尽量不要使用与背景色和坐标轴相近的颜色
折线图中的线条尽量不要超过4条,过多的线条会导致界面混乱,无法阅读。
3、饼图

饼图适合用来展示单一维度数据的占比,要求其数值没有零或者负值,并确保各个分块占比总和为100%。
饼图不适合用于精确数据的比较,因此当各类别数据占比相似时,很难分辨出哪个类别占比比较大。
大多数人的视觉习惯是按照顺时针自上而下的顺序去观察,因此在绘制饼图时建议从12点钟开始沿着顺时针右边的第一个分块绘制饼图最大的数据分块,这样可以有效地强调其重要性
4、散点图

如果一个散点图没有显示变量的任何关系,那么或许该图表类型不是次数据的最佳选择
散点图只有在足够多的数据点并且数据间有相关性时,才能呈现很好的结果。
如果数据包含不同系列,可以给不同系列使用不同的颜色

数据功能图介绍
在大数据的可视化图中,按照数据的作用和功能可以把图分为比较类图、分布类图、流程类图、地图类图、占比类图、区间类图、关联类图、时间类图和趋势类图等。
1、比较类图
比较类图可视化的方法通常是显示值与值之间的不同和相似之处,使用图形的长度、宽度、位置、面积、角度和颜色来比较数值的大小,通常用于展示不同分类间的数值对比一级不同时间点的数据对比。常见的比较类图主要有柱状图、双向柱状图、气泡图、子弹图、色块图、漏斗图和直方图等

2、分布类图
分布类图可视化的方法通常是显示频率,将数据分散在一个区间或分组,并使用图形的为、大小、颜色的渐变程度类表现数据的分布。分布类图通常用于展示连续数据上数值的分布情况。常见的分布类图主要有箱型图、热力图、散点图、分布曲线图、色块图和直方图

3、流程类图
流程类图可视化的方法通常是显示流程流转和流程流量。一般流程都会呈现出多个环节,每个环节之间会有相应的流量关系,因此这类图形可以很好的表示这些流量关系。常见的流程图主要有漏斗图和桑基图

4、地图类图
地图类图可视化的方法是显示地理区域上的数据,并在显示是使用地图作为背景,通过图形的位置来表现数据的地理位置。地图类图通常用来展示数据在不同地理区域上的分布情况。常见的地图类图主要有待气泡的地图和统计地图

5、占比类图
占比类图可视化的范式是显示同一维度上的占比关系。常见的占比类图主要有换图、马赛克图、堆叠面积图、堆叠柱状图和矩形树图

6、区间类图
区间类图可视化的方法是显示同一维度上值的上限和下限之间的差异。区间类图使用图形的大小和位置表示数值的上限和下限,通常用于表示数据在某一分类(时间点)上的最大值和最小值。常见的区间类图主要有仪表盘图和堆叠面积图

7、关联类图
关联类图可视化的方法显示数据之间的相互关系。关联类图使用图形的嵌套和位置表示数据之间的关系,通常用于表示数据之间的前后顺序、父子关系和相关性。常见的关联类图主要有和弦图、桑基图、矩阵树图、树状图和韦恩图

8、时间类图
时间类图可视化的方法显示以时间为特定维度的数据。时间类图使用图形的位置表现出数据在时间深的房补,通常用于表现数据在时间维度上的趋势和变化。常见的实践类图主要有面截图、K线图、卡吉图和螺旋图

9、趋势类图
趋势类图可视化的方式分析数据的变化趋势,趋势类图使用图形的位置表现出数据在连续区域上的分布,通常展示数据在连续区域上的大小变化的规律。常见的趋势类图主要有面积图、K线图、折线图和回归曲线图



四,源码

链接:https://pan.baidu.com/s/1gO_kPgEd_lJG5FpX7KjO7w
提取码:

创作不易,项目已加密,有偿(—9.9r—,可修改页面,做实验报告,代码讲解,待上服务器等…)

请私信作者(v)15135757306

注:非白嫖仅为维护服务器,若想白嫖请CSDN私信我(大概率可能时间忙顾不上回复)

若侵权请私信作者下架博客

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

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

相关文章

发生OOM时JVM会退出吗

程序是否退出和发生 OOM 无关 需要明确&#xff0c;程序是否退出和发生 OOM 无关&#xff0c;而和当前是否还有存活的非守护线程有关。 只要还有运行中的子线程&#xff0c;即使 main 线程结束或异常崩溃了&#xff0c;程序也不会停止。 public class TestThreadRun {privat…

管理类联考——逻辑——汇总篇——知识点突破——论证逻辑——论证模型

不同的模型对应的削弱、支持、假设。 归纳模型 模型识别 1.完全归纳 完全归纳指的就是所谓的穷举法&#xff0c;即通过某一类对象中的全部元素具备或者不具备某个性质&#xff0c;从而证明这一类对象都具备或者不具备某个性质。考试中一般不考察完全归纳&#xff0c;因此&am…

彻底了解 npm、cnpm、pnpm 、yarn几种包管理工具

npm、cnpm、pnpm 、yarn几种包管理工具 npmcnpmyarnpnpm四者的优缺点&#xff1a; npm npm 是 Node.js 自带的包管理器&#xff0c;平时通过 npm install 命令来安装各种 npm 包&#xff08;比如&#xff1a;npm install vue-router &#xff09;&#xff0c;就是通过这个包管…

基于OpenEuler的信创国产瘦客户机软件系统 DoraOS

DoraOS是一款瘦客户机系统软件&#xff0c;最新版本基于OpenEuler开发。可以将主机转化为专业的瘦客户机。目前支持x86架构的硬件。 软件下载地址为&#xff1a; https://www.doracloud.cn/downloads/32-cn.html 制作一张启动U盘&#xff0c;即可进行安装。 DoraOS的连接窗口…

3D数据导出工具HOOPS Publish:3D数据查看、生成标准PDF或HTML文档!

HOOPS中文网http://techsoft3d.evget.com/ 一、3D导出SDK HOOPS Publish是一款功能强大的SDK&#xff0c;可以创作丰富的工程数据并将模型文件导出为各种行业标准格式&#xff0c;包括PDF、STEP、JT和3MF。HOOPS Publish核心的3D数据模型是经过ISO认证的PRC格式(ISO 14739-1:…

【UIPickerView案例04-随机点餐完善 Objective-C语言】

一、之前我们讲到哪里 1)首先,是搭建界面 2)然后呢,是加载数据 先把这个数据文件,拖进来,然后呢,设置它的代理对象、数据源对象 然后呢,在控制器里面,遵守对应的协议, 实现对应的方法 跟TableView的思路,一样一样的, 也是,把多少行返回 把多少组,返回 然后呢…

【python爬虫】12.建立你的爬虫大军

文章目录 前言协程是什么多协程的用法gevent库queue模块 拓展复习复习 前言 照旧来回顾上一关的知识点&#xff01;上一关我们学习如何将爬虫的结果发送邮件&#xff0c;和定时执行爬虫。 关于邮件&#xff0c;它是这样一种流程&#xff1a; 我们要用到的模块是smtplib和emai…

WordPress Page Builder KingComposer 2.9.6 Open Redirection

WordPress Page Builder KingComposer 2.9.6 Open Redirection WordPress 插件 KingComposer 版本2.9.6 以及以前版本受到开放重定向漏洞的影响。该漏洞在packetstorm网站披露于2023年7月24日&#xff0c;除了该漏洞&#xff0c;该版本的插件还存在XSS攻击的漏洞风险 图1.来自…

【无源谐波滤波器通常用于电力系统中的谐波抑制】用于抑制电力系统谐波的无源谐波滤波器(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

十年AI技术成果加持,猿辅导带你体验网课中的科技感

近年来&#xff0c;AI正以润物细无声的方式重塑多个行业的面貌&#xff0c;教育行业也不例外。同时&#xff0c;随着Chat GPT对社会带来的冲击不断加强&#xff0c;AI教育已经成为整个行业不可逆转的趋势。作为最早踏入智能教育领域的企业之一&#xff0c;猿辅导深谙技术革新对…

揭秘大企业的在线帮助中心搭建都有什么技巧?

大企业的在线帮助中心是为了提供更好的客户支持和服务而设立的一个重要平台。一个优秀的在线帮助中心可以帮助企业有效地解决客户问题、提高客户满意度&#xff0c;并且节省人力资源。 搭建大企业在线帮助中心的技巧&#xff1a; 设计用户友好的界面&#xff1a;在线帮助中心…

OPPO手机便签数据搬家到华为mate60Pro手机怎么操作

今年8月底&#xff0c;华为上线了本年度的旗舰手机——华为mate60Pro。有不少网友都在抢购这台手机&#xff0c;不过在拿到新手机之后&#xff0c;还有一件重要的事情要做&#xff0c;这就是把旧手机中比较重要的数据&#xff0c;例如图片、短信、通讯录、联系人、便签等数据搬…

13 PyQt5控件之QTreeWidget

目录 1 官方帮助文档2 基本使用3 模型事件 1 官方帮助文档 QTreeWidget Qt5.15帮助文档 2 基本使用 #!/usr/bin/python3 # -*- coding: GBK -*-import sys from PyQt5.QtCore import QSize from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import *class QTreeWidgetDe…

计算机毕设之基于python+django+mysql数据可视化的智慧社区内网平台(包含文档+源码+部署教程)

系统阐述的是一款基于数据可视化的智慧社区内网平台的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系…

xxl-job 任务调度搭建及简单使用

xxl-job是开源架构&#xff0c;可以通过它实现调度中心和执行器。 git地址和 官网中进行了详细的技术说明。   xxl-job支持单机部署和集群式部署&#xff0c;在集群式部署中又可以实现调度中心集群式部署和执行器集群式部署。本文主要针对调度中心和执行器分离单机部署方式进…

因为axios请求后端,接收不到token的问引出的问题

vue axios请求后端接受不到token的问题。 相关概念 什么是跨域&#xff1f; 跨域指的是在浏览器环境下&#xff0c;当发起请求的域&#xff08;或者网站&#xff09;与请求的资源所在的域之间存在协议、主机或端口中的任何一个条件不同的情况。换句话说&#xff0c;只要协议、…

java八股文面试[JVM]——如何打破双亲委派模型

双亲委派模型的第一次“被破坏”是重写自定义加载器的loadClass(),jdk不推荐。一般都只是重写findClass()&#xff0c;这样可以保持双亲委派机制.而loadClass方法加载规则由自己定义&#xff0c;就可以随心所欲的加载类&#xff0c;典型的打破双亲委派模型的框架和中间件有tomc…

基于Java的ssm高校教学业绩信息管理系统源码和论文

基于Java的ssm高校教学业绩信息管理系统源码和论文122 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存…

如何使用Windows Xshell连接另外一台主机上的虚拟机解决方案

前言 我需要使用我自己的笔记本打开虚拟机服务&#xff0c;如何使用我的台式电脑进行服务访问 环境&#xff1a; 台式&#xff1a;Windows10 笔记本&#xff1a;Windows10 网络是由笔记本开放热点&#xff0c;在同一局域网下 正文 首先我们先要看&#xff0c;我们所需要的虚拟…

Python中重要的条件语句教程

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一. 了解条件语句 假设一个场景&#xff1a; 同学们这个年龄去过网吧吗&#xff1f; 去网吧进门想要上网必须做的一件事是做什么&#xff1f;&#xff08;考虑重点&#xff09; 为什么要把身份证给工作人员&#xf…