主頁 > 軟體設計 > 基于js+echarts實作資料可視化

基于js+echarts實作資料可視化

2021-10-23 21:57:50 軟體設計

本專案中使用的是echarts圖表庫,Echarts提供了常規的折線圖、柱狀圖、散點圖、餅圖、k線圖,用于統計的盒形圖,用于地理資料可視化的地圖、熱力圖、線圖,用于關系資料可視化的關系圖、treemap、旭日圖,多維資料可視化的平行坐標,還有用于 BI 的漏斗圖,儀表盤,并且支持圖與圖之間的混搭,

一、效果展示圖

二、目錄結構

三、echarts基本使用

五步曲 one by one 教你 保你會

  • 下載并引入echarts.js檔案 地址:Apache ECharts
  • 準備一個具備大小的DOM容器
  • 初始化echarts實體物件
  • 指定配置項和資料(option)
  • 將配置項設定給echarts實體物件

下面是一個簡單的實體

第一步

第二步

第三步

第四步

第五步

最終的效果

僅僅會插入圖表也是不夠的,通過修改里面的配置項里面的屬性來達到專案需求,直接去百度更方便,但是呢我們需要學會去查找檔案echarts官網-檔案-配置項手冊

上面這個小例子就是為了讓大家對echarts不迷茫,基本使用要會喲

四、知識點梳理

再回到我們的專案上面,從專案效果可以看出里面的引數很多,如果都去重新定義一個新的變數的話,代碼很多容易混淆,占用的空間也很大,這里呢 我們就使用立即執行函式

立即執行函式:

宣告一個函式,并馬上呼叫這個匿名函式就叫做立即執行函式;即立即執行函式是定義函式以后立即執行該函式,

()()

里面定義的引數相對于是區域變數,即使變數名相同,也不會有影響的,所以就放心使用吧

專案里面每個盒子的邊框不再是中規中矩的border了,之所以看起來很高級,那是因為邊框里面有圖片喲,大家不要覺得很難,因為它真的很簡單

邊框圖片

邊框效果圖:

首先來了解下邊框圖片需要掌握的屬性

屬性說明
border-image-source用在邊框的圖片的路徑
border-image-slice圖片邊框內向偏移 裁剪的尺寸,一定不加單位,上右下左順序進行裁剪
border-image-width圖片邊框的寬度(需要加單位)注意:不是邊框的寬度而是邊框圖片的寬度
border-image-repeat圖片邊框是否平鋪(repeat)、鋪滿(round)、或拉伸(stretch)默認拉伸

我們來看看border-image-repeat屬性值不同的效果

<style>
        html {
            font-size: 80px !important;
        }

        .box {
            width: 200px;
            height: 200px;
            position: relative;
            border: 15px solid transparent;
            border-width: 0.6375rem 0.475rem 0.25rem 1.65rem;
            border-image-source: url(../charts-project/images/border.png);
            border-image-slice: 51 38 20 132;
            margin-bottom: 0.25rem;
        }

        .inner {
            position: absolute;
            top: -0.6375rem;
            left: -1.65rem;
            right: -0.475rem;
            bottom: -0.25rem;
            padding: 0.3rem 0.45rem;
            font-size: .25rem;
            color: #fff;
        }
    </style>
</head>

<body style="background:url('./images/bg.jpg');">
    <div class="box">
        <div class="inner">你好</div>
    </div>
</body>

分割多少,就以四個角圖片的完整度來喲

很多人會疑惑🤔 為什么還要在box盒子里面放一個inner盒子呢,注意看由于盒子模型的原因 如果直接寫文字,文字的書寫位置就達不到我們想要的這種效果,所以通過在邊框里面再添加一個子盒子,利用定位 ,里面的內容就可以改變位置啦,快去試一試吧

字體圖示

這里為什么要將字體圖示呢,以前我們使用字體圖示非常的麻煩 ,這里教給大家一種新的方法:通過類名呼叫字體圖示

使用步驟

  • HTML頁面引入字體圖示中css檔案
  • 標簽直接呼叫圖示對應的類名即可

老規矩,還是用一個簡單的例子 這樣大家就不用迷茫了,博主辛辛苦苦的為大家書寫例題,一定要三步曲喲

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../charts-project/fonts/style.css">
</head>
<body>
    <div class="icon-codeigniter"></div>
</body>
</html>

類名是怎么來的呢:直接在style.css里面復制

效果圖:

修改線性漸變色方法

圖中的統計圖呈現的是一個顏色漸變的效果 看起來很好看 一起來看看它是如何實作的吧

效果圖:

注意修改的是option物件里面的color屬性喲

方法一:提倡這種方法 比較簡單

color:new echarts.graphic.LinearGradient(
         //(x1,y2)點到點(x2,y2)之間進行漸變
        0,0,0,1,
        [
           {offset:0,color:'#00fffb' },//0起始顏色
           {offset:1,color:'#0061ce' },//1結束顏色
        ]
),

方法二:

// 修改線性漸變色方式 2
color: {
    type: 'linear',
    x: 0,
    y: 0,
    x2: 0,
    y2: 1,
    colorStops: [{
        offset: 0, color: 'red' // 0% 處的顏色
    }, {
        offset: 1, color: 'blue' // 100% 處的顏色
    }],
    globalCoord: false // 預設為 false
},

半圓形做法

前面只是教大家如何使用echarts圖表,但是這種半圓里面是沒有的,需要我們自己自己通過它提供的扇形圖 自己修改 ,本質還以一個餅形

效果圖:

做法:把一個餅形圖分成三段,下面一段顏色設定為透明色即可,做一個拱形離不開的是將不透明的那一部分旋轉正,在series里面設定調角度 其默認的角度是90度

startAngle :180 /起始角度,支持的范圍是[0,360]

注意:此角度不是旋轉角度,而是起始角度,

我們先來看看餅圖的起始角度

上面這個圖是我給大家準備的在線案例圖,根據我的這個步驟,不會都很難啊

全國熱榜模塊制作

效果圖: 從上面的動圖 大家就可以知道這個模塊要實作的功能,根據定時器 去切換到各省份相應的資料,與之前不同的是近30日的資料不是在html里面準備好的,而是動態的存盤資料得到的,一起來看看它是如何實作的吧

從這個案例中我們要學到的知識點

  1. 實際開發中,后臺回傳的真實資料如何渲染到頁面中
  2. ES6模版字符相關知識-拼接字串

ES6模版字符:

`${運算式} ` //模版字串使用返鉤號‘’而且允許自動換行 反鉤號是tab鍵上面的那個鍵

首先準備相關資料

首先來看它里面的屬性 city、sales、flag是各省熱銷的資料 flag的值決定了箭頭的方向,true就是箭頭向上,反之則向下;

brands陣列里面的物件是與城市相對應地資料模塊,里面的flag屬性和外面的含義一樣

    var hotData = [
      {
        city: "北京",
        sales: "25, 179",
        flag: true,
        brands: [
          // 品牌種類資料
          { name: "可愛多", num: "9,086", flag: true },
          { name: "哇哈哈", num: "8,341", flag: true },
          { name: "喜之郎", num: "7,407", flag: false },
          { name: "小旺仔", num: "6,080", flag: false },
          { name: "小洋人", num: "6,724", flag: false },
          { name: "好多魚", num: "2,170", flag: true },
        ]
      },
      {
        city: "上海",
        sales: "20, 760",
        flag: true,
        brands: [
          // 品牌種類資料
          { name: "可愛多", num: "2,345", flag: true },
          { name: "哇哈哈", num: "7,109", flag: true },
          { name: "喜之郎", num: "3,701", flag: false },
          { name: "小旺仔", num: "6,080", flag: false },
          { name: "小洋人", num: "2,724", flag: false },
          { name: "好多魚", num: "2,998", flag: true },
        ]
      },
      {
        city: "河北",
        sales: "21, 180",
        flag: false,
        brands: [
          // 品牌種類資料
          { name: "可愛多", num: "8,907", flag: true },
          { name: "哇哈哈", num: "9,541", flag: true },
          { name: "喜之郎", num: "9,447", flag: false },
          { name: "小旺仔", num: "6,090", flag: false },
          { name: "小洋人", num: "5,924", flag: false },
          { name: "好多魚", num: "2,870", flag: true },
        ]
      },
      {
        city: "江蘇",
        sales: "28,148 ",
        flag: false,
        brands: [
          // 品牌種類資料
          { name: "可愛多", num: "9,889", flag: true },
          { name: "哇哈哈", num: "7,381", flag: true },
          { name: "喜之郎", num: "5,487", flag: false },
          { name: "小旺仔", num: "2,080", flag: false },
          { name: "小洋人", num: "6,924", flag: false },
          { name: "好多魚", num: "2,770", flag: true },
        ]
      },
      {
        city: "山東",
        sales: "27, 874",
        flag: true,
        brands: [
          // 品牌種類資料
          { name: "可愛多", num: "9,186", flag: true },
          { name: "哇哈哈", num: "6,341", flag: true },
          { name: "喜之郎", num: "8,447", flag: false },
          { name: "小旺仔", num: "7,087", flag: false },
          { name: "小洋人", num: "5,624", flag: false },
          { name: "好多魚", num: "2,370", flag: true },
        ]
      }
    ]

資料準備好啦,接下來就是將資料渲染到頁面中

首先就是遍歷上面的資料,index是索引號,item是對應的物件,里面有幾個物件,各省里面就有幾個li,我們使用字串的形式將遍歷的資訊放入到supHTML里面,直接用html()方法添加到sup盒子中,此方法識別標簽和換行,ES6模版字符里面不能書寫if陳述句 但是可以用三元運算式,根據flag屬性值判斷箭頭的方向

    //(1) 遍歷 hotData 物件
    var supHTML = "";
    $.each(hotData, function (index, item) {
      supHTML += `<li><span>${item.city}</span><span>${item.sales}<s class=${item.flag ? "icon-arrow-up2" : "icon-arrow-down2"}></s></span></li>`;
    });
    $(".sup").html(supHTML);

此模塊實作的功能是使用定時器跟新內容,當滑鼠經過的時候定時器就停止,滑鼠離開開啟定時器

因為當我們滑鼠經過和定時器觸發都要改變相應城市的資料,何不將這個功能封裝到一個函式里面呢,哪里需要就直接呼叫它

這個函式就是將各城市的資料資訊插入到sub盒子里面

hotData[that.index()].brands 里面的that.index()]就是當前城市的索引號,通過城市的索引號找到對應的陣列里面的brands資料,還是利用相同的方法添加到sub盒子里面

function render(that) {
      that.addClass("active").siblings().removeClass();
      // console.log(hotData[$(this).index()].brands);
      var subHTML = "";
      $.each(hotData[that.index()].brands, function (i, item) {
        subHTML += `<li><span>${item.name}</span><span>${item.num}<s class=${item.flag ? "icon-arrow-up2" : "icon-arrow-down2"}></s></span></li>`;
      });
      $(".sub").html(subHTML);
    }

頁面一重繪 就是第一個li設定為滑鼠經過事件,

設定一個index遍歷 控制顯示li,當到達最后一個li的時候,又重第一個li開始高亮顯示,所以用一個if陳述句判斷,呼叫render函式,注意的是里面的實參,不再是this指向 而是當前高亮的是第幾個li,對應的li里面渲染資料,再實作用戶滑鼠經過和離開事件,滑鼠經過定時器就停止,滑鼠離開,計時器就開啟

 // 默認把第一個li 處于滑鼠經過狀態
    var lis = $(".province .sup li");
    lis.eq(0).mouseenter();
    // 開啟定時器
    var index = 0;
    var timer = setInterval(function () {
      index++;
      if (index >= 5) index = 0;
      render(lis.eq(index));
    }, 2000);

    $(".province .sup").hover(
      function () {
        clearInterval(timer);
      },
      function () {
        clearInterval(timer);
        timer = setInterval(function () {
          index++;
          if (index >= 5) index = 0;
          render(lis.eq(index));
        }, 2000);
      }
    )

當滑鼠經過當前的li高亮,此時render里面的實參就是當前的li, index = $(this).index();這句代碼是當我們經過li之后,那么我們定時器里面的index就會發生改變,它的下一個li就不再是定時器里面index的順序了,索引在我們滑鼠經過的時候,要將當前的li的索引號給index,確保定時器是從當前li開始執行的

   $(".province .sup").on("mouseenter", "li", function () {
      index = $(this).index();
      render($(this));
    });

五、總結

以上就是資料可視化專案的全部知識點啦,博主并不是將這個專案的代碼復制過來大家欣賞,而是通過根據實際例子來講解這個專案所用到的技術,所有的方法都教給大家啦,自己動手試試吧,方法會了還怕不會做嗎

授之以魚不如授之以漁

別忘啦 三步曲 點贊👍 評論 ?? 收藏 🌟

是不是

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332645.html

標籤:其他

上一篇:如何在xpath中列印前面的同輩人

下一篇:@Scripts.Render("~/bundles/bootstrap")拋出NullReferenceException

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more