<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        使用D3.js構(gòu)建實(shí)時圖形的示例代碼

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:09:08
        文檔

        使用D3.js構(gòu)建實(shí)時圖形的示例代碼

        使用D3.js構(gòu)建實(shí)時圖形的示例代碼:首先你需要在計算機(jī)上安裝Node和npm。 數(shù)據(jù)的可視化表示是傳遞復(fù)雜信息的最有效手段之一,D3.js提供了創(chuàng)建這些數(shù)據(jù)可視化的強(qiáng)大工具和靈活性。 D3.js是一個JavaScript庫,用于使用SVG,HTML和CSS在Web瀏覽器中生成動態(tài)的交互式數(shù)據(jù)可視化。 D3 提供了各種
        推薦度:
        導(dǎo)讀使用D3.js構(gòu)建實(shí)時圖形的示例代碼:首先你需要在計算機(jī)上安裝Node和npm。 數(shù)據(jù)的可視化表示是傳遞復(fù)雜信息的最有效手段之一,D3.js提供了創(chuàng)建這些數(shù)據(jù)可視化的強(qiáng)大工具和靈活性。 D3.js是一個JavaScript庫,用于使用SVG,HTML和CSS在Web瀏覽器中生成動態(tài)的交互式數(shù)據(jù)可視化。 D3 提供了各種

        首先你需要在計算機(jī)上安裝Node和npm。

        數(shù)據(jù)的可視化表示是傳遞復(fù)雜信息的最有效手段之一,D3.js提供了創(chuàng)建這些數(shù)據(jù)可視化的強(qiáng)大工具和靈活性。

        D3.js是一個JavaScript庫,用于使用SVG,HTML和CSS在Web瀏覽器中生成動態(tài)的交互式數(shù)據(jù)可視化。

        D3 提供了各種簡單易用的函數(shù),大大簡化了 JavaScript 操作數(shù)據(jù)的難度。由于它本質(zhì)上是 JavaScript ,所以用 JavaScript 也是可以實(shí)現(xiàn)所有功能的,但它能大大減小你的工作量,尤其是在數(shù)據(jù)可視化方面,D3 已經(jīng)將生成可視化的復(fù)雜步驟精簡到了幾個簡單的函數(shù),你只需要輸入幾個簡單的數(shù)據(jù),就能夠轉(zhuǎn)換為各種絢麗的圖形。有過 JavaScript 基礎(chǔ)的朋友一定很容易理解它。

        在本教程中,我們將探討如何使用D3.js和Pusher Channels構(gòu)建實(shí)時圖形。如果您在閱讀本教程時想要使用代碼,請查看此GitHub存儲庫,其中包含代碼的最終版本。

        準(zhǔn)備

        要完成本教程,您需要安裝Node.js和npm。我在創(chuàng)建本教程時使用的版本如下:

      1. Node.js v10.4.1
      2. npm v6.3.0
      3. 您還需要在計算機(jī)上安裝http-server。它可以通過運(yùn)行以下命令通過npm安裝:npm install http-server。

        雖然不需要Pusher知識,但如果熟悉它后,對學(xué)習(xí)JavaScript和D3.js會很有幫助。

        開始

        首先,為我們要構(gòu)建的應(yīng)用程序創(chuàng)建一個新目錄。將其稱為實(shí)時圖形或任何您喜歡的圖形。在新創(chuàng)建的目錄中,創(chuàng)建一個新的index.html文件并粘貼以下代碼:

        //index.html
        
         <!DOCTYPE html>
         <hml lang="en">
         <head>
         <meta charset="UTF-8">
         <meta name="viewport" content="width=device-width, initial-scale=1.0">
         <meta http-equiv="X-UA-Compatible" content="ie=edge">
         <link rel="stylesheet" href="style.css" rel="external nofollow" >
         <title>Realtime D3 Chart</title>
         </head>
         <body>
        
         <script src="https://js.pusher.com/4.2/pusher.min.js"></script>
         <script src="https://d3js.org/d3.v5.min.js"></script>
         <script src="app.js"></script>
         </body>
         </html>

        如您所見,HTML文件只是提取構(gòu)建圖形所需的樣式和腳本。我們正在利用D3.js來構(gòu)建圖表,并使用Pusher來添加實(shí)時功能。app.js文件是應(yīng)用程序前端代碼的寫入位置。

        在我們開始實(shí)現(xiàn)圖表之前,讓我們在style.css中添加應(yīng)用程序的樣式:

         // style.css
        
         html {
         height: 100%;
         box-sizing: border-box;
         padding: 0;
         margin: 0;
         }
        
         *, *::before, *::after {
         box-sizing: inherit;
         }
        
         body {
         height: 100%;
         font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
         overflow: hidden;
         background: linear-gradient(135deg, #ffffff 0%,#e8f1f5 100%);
         }
        
         .container {
         position: absolute;
         padding: 20px;
         top: 50%;
         left: 50%;
         background-color: white;
         border-radius: 4px;
         transform: translate(-50%, -50%);
         box-shadow: 0px 50px 100px 0px rgba(0,0,102,0.1);
         text-align: center;
         }
        
         .container h1 {
         color: #333;
         }
        
         .bar {
         fill: #6875ff;
         border-radius: 2px;
         }
        
         .bar:hover {
         fill: #1edede;
         }
        
         .tooltip {
         opacity: 0;
         background-color: rgb(170, 204, 247);
         padding: 5px;
         border-radius: 4px;
         transition: opacity 0.2s ease;
         }

        安裝服務(wù)器依賴項

        假設(shè)您安裝了Node和npm,請運(yùn)行以下命令來安裝應(yīng)用程序的服務(wù)器組件所需的所有依賴項:

        npm install express dotenv cors pusher

        Pusher 設(shè)置

        前往Pusher網(wǎng)站并注冊一個免費(fèi)帳戶。選擇側(cè)欄上的Channels apps,然后點(diǎn)擊Create Channels app以創(chuàng)建新應(yīng)用。

        創(chuàng)建應(yīng)用程序后,從API Keys選項卡中檢索憑據(jù),然后在項目目錄根目錄中創(chuàng)建一個variables.env文件,將以下內(nèi)容添加到這個文件中。

        // variables.env
        
         PUSHER_APP_ID=<your app id>
         PUSHER_APP_KEY=<your app key>
         PUSHER_APP_SECRET=<your app secret>
         PUSHER_APP_CLUSTER=<your app cluster>

        設(shè)置服務(wù)器

        現(xiàn)在我們已經(jīng)安裝了相關(guān)的依賴項并且已經(jīng)設(shè)置了我們的Pusher帳戶,我們可以開始構(gòu)建服務(wù)器。

        在項目目錄的根目錄中創(chuàng)建一個名為server.js的新文件,并粘貼以下代碼:

        // server.js
        
         require('dotenv').config({ path: 'variables.env' });
         const express = require('express');
         const cors = require('cors');
        
         const poll = [
         {
         name: 'Chelsea',
         votes: 100,
         },
         {
         name: 'Arsenal',
         votes: 70,
         },
         {
         name: 'Liverpool',
         votes: 250,
         },
         {
         name: 'Manchester City',
         votes: 689,
         },
         {
         name: 'Manchester United',
         votes: 150,
         },
         ];
        
         const app = express();
         app.use(cors());
        
         app.get('/poll', (req, res) => {
         res.json(poll);
         });
        
         app.set('port', process.env.PORT || 4000);
         const server = app.listen(app.get('port'), () => {
         console.log(Express running → PORT ${server.address().port});
         });

        保存文件并從項目目錄的根目錄運(yùn)行節(jié)點(diǎn)server.js以啟動服務(wù)器。

        設(shè)置前端應(yīng)用程序

        應(yīng)用程序的前端將寫在我們之前引用的app.js文件中。在項目目錄的根目錄中創(chuàng)建此文件,并在其中粘貼以下代碼:

        // app.js
        
         // set the dimensions and margins of the graph
         const margin = { top: 20, right: 20, bottom: 30, left: 40 };
         const width = 960 - margin.left - margin.right;
         const height = 500 - margin.top - margin.bottom;
        
         // set the ranges for the graph
         const x = d3
         .scaleBand()
         .range([0, width])
         .padding(0.1);
        
         const y = d3.scaleLinear().range([height, 0]);
        
         // append the container for the graph to the page
         const container = d3
         .select('body')
         .append('div')
         .attr('class', 'container');
        
         container.append('h1').text('Who will win the 2018/19 Premier League Season?');
        
         // append the svg object to the body of the page
         // append a 'group' element to 'svg'
         // moves the 'group' element to the top left margin
         const svg = container
         .append('svg')
         .attr('width', width + margin.left + margin.right)
         .attr('height', height + margin.top + margin.bottom)
         .append('g')
         .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
        
         // Create a skeleton structure for a tooltip and append it to the page
         const tip = d3
         .select('body')
         .append('div')
         .attr('class', 'tooltip');
        
         // Get the poll data from the /poll endpoint
         fetch('http://localhost:4000/poll')
         .then(response => response.json())
         .then(poll => {
         // add the x Axis
         svg
         .append('g')
         .attr('transform', 'translate(0,' + height + ')')
         .attr('class', 'x-axis')
         .call(d3.axisBottom(x));
        
         // add the y Axis
         svg
         .append('g')
         .attr('class', 'y-axis')
         .call(d3.axisLeft(y));
        
         update(poll);
         });
        
         function update(poll) {
         // Scale the range of the data in the x axis
         x.domain(
         poll.map(d => {
         return d.name;
         })
         );
        
         // Scale the range of the data in the y axis
         y.domain([
         0,
         d3.max(poll, d => {
         return d.votes + 200;
         }),
         ]);
        
         // Select all bars on the graph, take them out, and exit the previous data set.
         // Enter the new data and append the rectangles for each object in the poll array
         svg
         .selectAll('.bar')
         .remove()
         .exit()
         .data(poll)
         .enter()
         .append('rect')
         .attr('class', 'bar')
         .attr('x', d => {
         return x(d.name);
         })
         .attr('width', x.bandwidth())
         .attr('y', d => {
         return y(d.votes);
         })
         .attr('height', d => {
         return height - y(d.votes);
         })
         .on('mousemove', d => {
         tip
         .style('position', 'absolute')
         .style('left', ${d3.event.pageX + 10}px)
         .style('top', ${d3.event.pageY + 20}px)
         .style('display', 'inline-block')
         .style('opacity', '0.9')
         .html(
         <div><strong>${d.name}</strong></div> <span>${d.votes} votes</span>
         );
         })
         .on('mouseout', () => tip.style('display', 'none'));
        
         // update the x-axis
         svg.select('.x-axis').call(d3.axisBottom(x));
        
         // update the y-axis
         svg.select('.y-axis').call(d3.axisLeft(y));
         }

        在上面的代碼塊中,我們使用通過/ poll端點(diǎn)接收的初始數(shù)據(jù)創(chuàng)建了一個基本條形圖。如果您熟悉D3的工作原理,那么您應(yīng)該熟悉這些代碼。我在代碼的關(guān)鍵部分添加了注釋,以指導(dǎo)您構(gòu)建圖表的方式。

        在新終端中,啟動開發(fā)服務(wù)器以提供index.html文件:

        npx http-server

        我在這里使用http-server,但你可以使用你想要的任何服務(wù)器。您甚至可以直接在瀏覽器中打開index.html。

        此時,您的圖表應(yīng)如下所示:

        使用Pusher實(shí)時更新圖表

        讓我們確保輪詢的更新可以通過Pusher Channels實(shí)時反映在應(yīng)用程序的前端中。將以下代碼粘貼到app.js文件的末尾。

         // app.js
        
         const pusher = new Pusher('<your app key>', {
         cluster: '<your app cluster>',
         encrypted: true,
         });
        
         const channel = pusher.subscribe('poll-channel');
         channel.bind('update-poll', data => {
         update(data.poll);
         });

        在這里,我們打開了與Channels的連接,并使用Pusher的subscribe()方法訂閱了一個名為poll-channel的新頻道。通過bind方法監(jiān)聽輪詢更新,并在收到更新后使用最新數(shù)據(jù)調(diào)用update()函數(shù),以便重新呈現(xiàn)圖形。

        不要忘記使用Pusher帳戶信息中心中的相應(yīng)詳細(xì)信息替換占位符。

        從服務(wù)器觸發(fā)更新

        我們將模擬每秒更新一次的輪詢,并在數(shù)據(jù)發(fā)生變化時使用Pusher觸發(fā)更新,以便輪詢的訂閱者(客戶端)可以實(shí)時接收更新的數(shù)據(jù)。

        在其他導(dǎo)入下面的server.js頂部添加以下代碼:

         const Pusher = require('pusher');
        
         const pusher = new Pusher({
         appId: process.env.PUSHER_APP_ID,
         key: process.env.PUSHER_APP_KEY,
         secret: process.env.PUSHER_APP_SECRET,
         cluster: process.env.PUSHER_APP_CLUSTER,
         encrypted: true,
         });
        
         function getRandomNumber(min, max) {
         return Math.floor(Math.random() * (max - min) + min);
         }
        
         function increment() {
         const num = getRandomNumber(0, poll.length);
         poll[num].votes += 20;
         }
        
         function updatePoll() {
         setInterval(() => {
         increment();
         pusher.trigger('poll-channel', 'update-poll', {
         poll,
         });
         }, 1000);
         }

        然后將/ poll端點(diǎn)更改為如下所示:

         app.get('/poll', (req, res) => {
         res.json(poll);
         updatePoll();
         });

        / poll路由將初始輪詢數(shù)據(jù)發(fā)送到客戶端并調(diào)用updatePoll()函數(shù),該函數(shù)以三秒為間隔遞增隨機(jī)俱樂部的投票,并觸發(fā)我們在最后一步中在客戶端上創(chuàng)建的輪詢頻道的更新。

        通過從項目目錄的根目錄運(yùn)行節(jié)點(diǎn)server.js,終止服務(wù)器并重新啟動它。此時,您應(yīng)該有一個實(shí)時更新的條形圖。

        結(jié)論

        您已經(jīng)看到了使用D3.js創(chuàng)建條形圖的過程以及如何使用Pusher Channels實(shí)時創(chuàng)建條形圖。

        我們已經(jīng)為Pusher和D3提供了一個簡單的用例,但其中一個僅僅是表面上的問題。我建議深入研究docs,了解更多有關(guān)Pusher及其他功能的信息。

        謝謝閱讀!您可以在GitHub存儲庫中找到本教程的完整源代碼。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用D3.js構(gòu)建實(shí)時圖形的示例代碼

        使用D3.js構(gòu)建實(shí)時圖形的示例代碼:首先你需要在計算機(jī)上安裝Node和npm。 數(shù)據(jù)的可視化表示是傳遞復(fù)雜信息的最有效手段之一,D3.js提供了創(chuàng)建這些數(shù)據(jù)可視化的強(qiáng)大工具和靈活性。 D3.js是一個JavaScript庫,用于使用SVG,HTML和CSS在Web瀏覽器中生成動態(tài)的交互式數(shù)據(jù)可視化。 D3 提供了各種
        推薦度:
        標(biāo)簽: 使用 代碼 的代碼
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲伊人久久精品影院| 国内精自视频品线六区免费| 国产精品免费看香蕉| 最新亚洲精品国偷自产在线| 国产免费一区二区三区| 亚洲嫩草影院在线观看| 91九色精品国产免费| 四虎必出精品亚洲高清| 女人18毛片水最多免费观看| 亚洲一卡一卡二新区无人区| 在线jlzzjlzz免费播放| 美女被免费视频网站a| 亚洲免费日韩无码系列 | 亚洲AV无码成人专区片在线观看| 国产成人1024精品免费| 久久久久国产亚洲AV麻豆| 成人免费一区二区三区| 久久精品国产亚洲| 国产电影午夜成年免费视频| 亚洲日韩国产二区无码| 免费国产成人午夜私人影视| aa午夜免费剧场| 亚洲美女激情视频| 日韩免费三级电影| 久久精品无码免费不卡| 久久亚洲AV成人出白浆无码国产| 91成人免费在线视频| 国产亚洲视频在线| 久久精品国产精品亚洲色婷婷| 亚洲精品第一国产综合境外资源| 一级做a爱过程免费视| 亚洲精品在线免费观看| 综合亚洲伊人午夜网| 亚洲午夜免费视频| 亚洲一区二区三区高清在线观看| 免费国产成人高清视频网站| 免费国产黄网站在线观看| 亚洲国产AV无码一区二区三区 | 中国在线观看免费国语版| 99亚洲乱人伦aⅴ精品| 亚洲成人精品久久|