成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何繪制好看的動(dòng)態(tài)排序圖,今天手把手教學(xué)

開發(fā) 項(xiàng)目管理
學(xué)了 Java之后才知道自己是有多菜,,,以前并沒(méi)有刻意的去了解語(yǔ)言背后的基礎(chǔ)知識(shí),例如進(jìn)程、內(nèi)存管理,比如程序啟動(dòng)后沒(méi)報(bào)錯(cuò)但長(zhǎng)時(shí)間沒(méi)有反應(yīng)、通過(guò)任務(wù)管理器發(fā)現(xiàn)資源一直在消耗著;是一直等著或者重新再啟動(dòng)程序,還是去定位問(wèn)題并解決、優(yōu)化代碼,如果要定位問(wèn)題從哪里下手?

[[403827]]

本文轉(zhuǎn)載自微信公眾號(hào)「小張Python」,作者zeroingi 。轉(zhuǎn)載本文請(qǐng)聯(lián)系小張Python公眾號(hào)。

 0. 前言

大家好啊,已經(jīng)好久沒(méi)更原創(chuàng)文了,失蹤人口回歸 ~,近期要準(zhǔn)備秋招了在學(xué)一些 Java 相關(guān)知識(shí),更文什么的也就耽擱了

之前一直是在與 Python 打交道,但這不馬上要找工作了么,Python 雖然全能但目前不是企業(yè)所需的主流語(yǔ)言,跟C++、Java 相比還挺弱勢(shì)的,因此想借此好好學(xué)一下 Java,希望能趕上秋招的末班車

學(xué)了 Java之后才知道自己是有多菜,,,以前并沒(méi)有刻意的去了解語(yǔ)言背后的基礎(chǔ)知識(shí),例如進(jìn)程、內(nèi)存管理,比如程序啟動(dòng)后沒(méi)報(bào)錯(cuò)但長(zhǎng)時(shí)間沒(méi)有反應(yīng)、通過(guò)任務(wù)管理器發(fā)現(xiàn)資源一直在消耗著;是一直等著或者重新再啟動(dòng)程序,還是去定位問(wèn)題并解決、優(yōu)化代碼,如果要定位問(wèn)題從哪里下手?

網(wǎng)絡(luò)TCP/IP 協(xié)議:猜測(cè)現(xiàn)在看這篇文章的很多小伙伴們是為了學(xué)爬蟲而學(xué) Python,現(xiàn)在也有兩個(gè)問(wèn)題問(wèn)大家:1,Response Headers 中常見(jiàn)的Cookie 、Session指的是什么, 針對(duì)反爬機(jī)制帶 Cookie去訪問(wèn)服務(wù)器的原理又是什么?2,當(dāng)請(qǐng)求目標(biāo)站點(diǎn)獲取數(shù)據(jù)時(shí),返回的狀態(tài)碼中2xx,3xx,4xx分別代表什么?以上列舉的這兩個(gè)問(wèn)題都與計(jì)算機(jī)網(wǎng)絡(luò)相關(guān),了解它們之后做爬蟲的話才更能游刃有余,而類似于正則、bs4文本解析只是工具而已,學(xué)習(xí)的話上手很快

垃圾回收、緩存一致性等相關(guān)知識(shí):有時(shí)候?yàn)榱丝s短任務(wù)執(zhí)行周期,會(huì)用到線程,使用時(shí) Python 中的 GIL(全局解釋器鎖)能夠保證程序運(yùn)行時(shí)的數(shù)據(jù)一致性問(wèn)題,但里面的原理機(jī)制是什么?

后來(lái)接觸了這些知識(shí)才發(fā)現(xiàn),操作系統(tǒng)、語(yǔ)言特性、計(jì)算機(jī)網(wǎng)絡(luò)、數(shù)據(jù)結(jié)構(gòu)與算法這些基礎(chǔ)知識(shí)才是計(jì)算機(jī)入門的開始(語(yǔ)言只能說(shuō)是一種工具),只有掌握了基礎(chǔ)知識(shí),以后的學(xué)習(xí)之路才會(huì)更扎實(shí)、更順利;也就應(yīng)證了一句老話 基礎(chǔ)不牢、地動(dòng)山搖

平常的我只知道為了一些功能學(xué)習(xí)一下相關(guān)庫(kù)函數(shù),把腳本實(shí)現(xiàn)出來(lái)即可俗稱 調(diào)包俠 吧。也希望大家在以后的學(xué)習(xí)路上引以為戒,重視基礎(chǔ)知識(shí)。

1. anichart 介紹

啰嗦了這么多,正式開始本期技術(shù)案例分享,關(guān)于動(dòng)態(tài)排序圖制作之前分享過(guò)一篇文章,用的是 matplolib 的 animation 函數(shù),感興趣的可以看下用python制作超燃動(dòng)態(tài)排序圖!

基本功能是實(shí)現(xiàn)了,但最終效果并不那么友好,這種方法制圖的基本原理就是先把數(shù)據(jù)借助 Matplotlib 可視化為每一幀圖片,再將每一幀拼接為視頻,缺點(diǎn)很明顯:步驟繁瑣、代碼量多,可視化效果差

今天分享另外一種方法,制作此類狀態(tài)圖,用到的是一個(gè) Github 項(xiàng)目 anichart,眾所周知目前如果想做一些絲滑流暢的可視化交互效果,javascripts 是必不可缺少的,而這個(gè)項(xiàng)目主要是用 typescript 實(shí)現(xiàn),項(xiàng)目是由一個(gè) B 站 Up主【Jannchie見(jiàn)齊】維護(hù)

typescript 語(yǔ)言是基于 js 開發(fā)的一門編程語(yǔ)言,為了彌補(bǔ)后者可維護(hù)性差、類型混亂等缺點(diǎn);anichart 的主要功能是來(lái)制作動(dòng)態(tài)排序圖,可視化效果要好得多,下面是我根據(jù)針對(duì)項(xiàng)目中提供的測(cè)試數(shù)據(jù)最終繪制的排序圖,

2. 環(huán)境介紹

先交代下本次用到的項(xiàng)目環(huán)境,anichart 整體算是一個(gè)前端項(xiàng)目,因此本次用到的工具都是一些與前端相關(guān)的,本期教程只是介紹給大家這個(gè)項(xiàng)目怎么用,關(guān)于具體細(xì)節(jié)不需要去考慮,所以無(wú)需擔(dān)心自己是否具備前端知識(shí);

需要用到的軟件如下:

  • node.js;
  • ffmpeg;

測(cè)試系統(tǒng)為 Win10;

Node.js 在這里主要有兩個(gè)作用:1,管理下載項(xiàng)目所需要的一些依賴項(xiàng),2,啟動(dòng) js 腳本;

ffmpeg 主要是將序列圖片轉(zhuǎn)化為視頻

關(guān)于 node.js 與 ffmpeg 在 windows下載安裝方式比較簡(jiǎn)單,這里不多做介紹啦,這里給大家推薦兩個(gè)鏈接可以參考下:

Node.js 安裝:https://www.jianshu.com/p/2958fc051bfb

ffmpeg 安裝:https://zhuanlan.zhihu.com/p/118362010

兩個(gè)軟件安裝好之后,不要忘記配置環(huán)境變量~

3. anichart 庫(kù)使用

3.1 anichart安裝

anichart 作者已經(jīng)把上傳至 npm 官網(wǎng)中,打開命令行,借助 npm i anichart 命令即可安裝,不需要我們?cè)購(gòu)?Github 上克隆,

npm是什么東東?npm其實(shí)是Node.js的包管理工具(package manager),也就是說(shuō)你配置好 Node.js 命令之后,npm 就可以正常使用了

3.2 新建一個(gè) js文件

安裝完之后,接下來(lái)就能使用了,在anichart 安裝路徑下 新建一個(gè) js 文件,文件名可任意命名,然后把下面代碼添加到剛剛建立的 js 文件

  1. const ani = require('anichart'
  2. const stage = new ani.Stage() 
  3. stage.options.fps = 24 
  4. stage.options.sec = 30 
  5. stage.output = false 
  6.  
  7. const bgAni = new ani.RectAni() 
  8. bgAni.component.shape = { 
  9.   width: stage.canvas.width, 
  10.   height: stage.canvas.height, 
  11. bgAni.component.fillStyle = '#1e1e1e' 
  12.  
  13. const textLinesAni = new ani.TextLinesAni() 
  14.  
  15. textLinesAni.component.fillStyle = '#eee' 
  16. textLinesAni.component.textAlign = 'center' 
  17. textLinesAni.component.textBaseline = 'middle' 
  18. textLinesAni.component.position = { 
  19.   x: stage.canvas.width / 2, 
  20.   y: stage.canvas.height / 2, 
  21.  
  22. const textAnichart = new ani.TextAni() 
  23. textAnichart.component.fontSize = 48 
  24. textAnichart.component.font = 'Sarasa Mono Slab SC' 
  25. textAnichart.component.text = 'Anichart' 
  26. textAnichart.component.fontWeight = 'bolder' 
  27. textAnichart.type = 'blur' 
  28.  
  29.  
  30. textLinesAni.children.push(textAnichart) 
  31.  
  32.  
  33. ani.recourse.loadImage('H:/Data/data/ANI.png''logo'
  34. ani.recourse.loadImage( 
  35.   'https://avatars3.githubusercontent.com/u/29743310?s=460&u=8e0d49b98c35738afadc04e70c7f3918d6ad8cdb&v=4'
  36.   'jannchie' 
  37.  
  38. ani.recourse.loadCSV('H:/Data/data/test.csv''data'
  39.  
  40.  
  41. const rectAni = ani.createAni( 
  42.   [ 
  43.     new ani.Rect({ 
  44.       position: { x: 100, y: 0 }, 
  45.       shape: { width: 100, height: 0 }, 
  46.       fillStyle: '#d23'
  47.     }), 
  48.     new ani.Rect({ 
  49.       shape: { width: 100, height: 200 }, 
  50.       fillStyle: '#2a3'
  51.       alpha: 1, 
  52.     }), 
  53.     new ani.Rect({ 
  54.       shape: { width: 100, height: 0 }, 
  55.       fillStyle: '#569'
  56.       alpha: 0, 
  57.     }), 
  58.   ], 
  59.   [0, 1, 2], 
  60.   ani.ease.easeElastic 
  61.  
  62. const logoCenter = new ani.Image({ 
  63.   path: 'H:/Data/data/ANI.png'
  64.   position: { 
  65.     x: stage.canvas.width / 2, 
  66.     y: stage.canvas.height / 2, 
  67.   }, 
  68.   alpha: 0.25, 
  69.   center: { x: 128, y: 128 }, 
  70.   shape: { width: 256, height: 256 }, 
  71. }) 
  72. const logoAni = ani.createAni( 
  73.   [ 
  74.     new ani.Image({ 
  75.       path: 'H:/Data/data/ANI.png'
  76.       position: { 
  77.         x: 0, 
  78.         y: stage.canvas.height - 108, 
  79.       }, 
  80.       shape: { width: 128, height: 128 }, 
  81.     }), 
  82.     new ani.Image({ 
  83.       path: 'H:/Data/data/ANI.png'
  84.       position: { 
  85.         x: stage.canvas.width - 128, 
  86.         y: stage.canvas.height - 108, 
  87.       }, 
  88.       shape: { width: 128, height: 128 }, 
  89.       alpha: 1.0, 
  90.     }), 
  91.     new ani.Image({ 
  92.       path: 'H:/Data/data/ANI.png'
  93.       position: { 
  94.         x: stage.canvas.width - 128, 
  95.         y: stage.canvas.height - 108, 
  96.       }, 
  97.       shape: { width: 128, height: 128 }, 
  98.       alpha: 0, 
  99.     }), 
  100.   ], 
  101.   [0, 1, 2], 
  102.   ani.ease.easeBounce 
  103.  
  104. const barChart = new ani.BarChart({ 
  105.   shape: { width: stage.canvas.width, height: stage.canvas.height }, 
  106.   labelFormat(id) { 
  107.     return id 
  108.     // return meta.get(id).name
  109.   }, 
  110.   aniTime: [0, 30], 
  111. }) 
  112.  
  113. const lineChart = new ani.LineChart({ 
  114.   aniTime: [0, 30], 
  115.   shape: { width: stage.canvas.width, height: stage.canvas.height / 2 }, 
  116.   position: { x: 0, y: stage.canvas.height / 2 }, 
  117. }) 
  118.  
  119.  
  120. stage.addChild(bgAni) 
  121. // stage.addChild(a) 
  122. stage.addChild(logoCenter) 
  123. stage.addChild(textLinesAni) 
  124. stage.addChild(rectAni) 
  125. stage.addChild(logoAni) 
  126. stage.addChild(barChart) 
  127. stage.addChild(lineChart) 
  128.  
  129.  
  130. const pie = new ani.PieChart({ 
  131.   aniTime: [0, 30], 
  132.   radius: [80, 120], 
  133.   position: { x: stage.canvas.width / 2, y: stage.canvas.height / 2 }, 
  134. }) 
  135.  
  136. stage.addChild(pie) 
  137. stage.play() 

運(yùn)行之前,需要改幾個(gè)參數(shù),第一個(gè)更改數(shù)據(jù)路徑

  1. ani.recourse.loadCSV('H:/Data/data/test.csv''data'

數(shù)據(jù)形式需以下面形式存放,后面 data 代表數(shù)據(jù)源中更改的列名,比如這里是以日期作為變量進(jìn)行序列化

  1. name,date,value,channel,other 
  2. Jannchie,2020-01-01,1,科技,other 
  3. Jannchie,2020-01-03,6,科技,other 
  4. Jannchie,2020-01-05,3,科技,other 
  5. Jannchie,2020-01-07,-,科技,other 
  6. Jannchie,2020-01-09,7,科技,other 
  7. Jannchie,2020-01-12,12,科技,other 
  8. Cake47,2020-01-03,10,生活,other 
  9. Cake47,2020-01-02,5,生活,other 
  10. Cake47,2020-01-06,2,生活,other 
  11. Cake47,2020-01-09,3,生活,other 
  12. Cake47,2020-01-11,4,生活,other 

第二個(gè)需要更改一下所有 png 路徑,改成你自己的,可以隨意替換為你的 圖片路徑,影響不大

  1. ani.recourse.loadImage('H:/Data/data/ANI.png''logo'

3.2 運(yùn)行 js 腳本

以上修改完之后,接下來(lái)就是啟動(dòng)腳本,在 js 同文件目錄下打開一個(gè)命令行,輸入 node XXX.js ,回車即可,XXX.js 代表你的 js 文件,效果如下

之后會(huì)有一個(gè)out 文件夾生成,里面存放的就是 anichart 繪制好的圖片

3.3 借助ffmpeg圖片生成視頻

最后,進(jìn)入out 文件夾,借助ffmpeg 命令將圖片合成視頻,

  1. ffmpeg -f image2 -framerate 12 -i output-%d.png foo.avi 

-framerate 后面參數(shù) 12 代表生成視頻的fps,可 根據(jù)自己情況設(shè)定,這里我設(shè)置的是 24;

最終一個(gè)動(dòng)態(tài)排序視頻就生成了,隨后自己也可以加一些 bgm 給視頻加一些 feel

4. js中一些參數(shù)介紹

關(guān)于 anichart 的使用,原作者并沒(méi)有介紹太多,Github 主頁(yè)上只介紹了最簡(jiǎn)單的使用方法

因此為了大家生成一些比較不錯(cuò)的可視化圖,對(duì)上面 js 代碼中的部分參數(shù)做一些簡(jiǎn)單介紹,增加一些對(duì)這個(gè) anichart 庫(kù)的理解

4.1 fps、sec

  1. stage.options.fps = 24 
  2.  
  3. stage.options.sec = 30 

fps 顧名思義就是一秒多少幀,sec 代表生成切片持續(xù)多長(zhǎng)時(shí)間(單位:秒);用上面參數(shù)來(lái)設(shè)定的話,會(huì)生成 24x30 = 720 張圖片;這兩個(gè)參數(shù)決定最終視頻的流暢度,后面用 ffmpeg 生成視頻時(shí),建議 framerate 參數(shù) fps保持 一致

4.2 ani.recourse.loadImage

  1. ani.recourse.loadImage( 
  2.   'https://avatars3.githubusercontent.com/u/29743310?s=460&u=8e0d49b98c35738afadc04e70c7f3918d6ad8cdb&v=4'
  3.   'jannchie' 

loadImage用來(lái)給柱狀圖中每個(gè)數(shù)據(jù)條上加一個(gè) 圖片 logo,方法需要加入兩個(gè)參數(shù),前者表示圖片路徑或網(wǎng)頁(yè)鏈接,后者表示需要加logo 的數(shù)據(jù)條名字,例如這里選擇的數(shù)據(jù)條名字為 jannchie,可視化效果如下

4.3 BarChart、LineChart、PieChart

BarChart、LineChart、PieChart 分別表示柱狀圖、曲線圖、餅圖;anichart 除了這三類圖形外還有 ItemChart、BaseChart、MapChart 等,

anichart 在所有圖形對(duì)象中,都需要加入兩個(gè)參數(shù),shape 和 aniTime,前者代表形狀大小、后者表示該圖形持續(xù)時(shí)間,單位 s

4.4 stage.addChild(xx)

anichart 通過(guò) stage.addChild() 函數(shù)使得創(chuàng)建的對(duì)象生效 ,stage 表示全局 畫布,通過(guò)以下命令生成

  1. const ani = require('anichart'
  2.  
  3. const stage = new ani.Stage() 

5. 源碼數(shù)據(jù)獲取

為了方便,本文中涉及到的源碼、測(cè)試數(shù)據(jù)已經(jīng)被我打包在一起了,獲取方式:在公眾號(hào) 小張Python 后臺(tái),回復(fù)關(guān)鍵字:210605 即可獲取

6. 小結(jié)

關(guān)于動(dòng)態(tài)排序圖制作除了這兩種方法之外,再向大家推薦一個(gè)網(wǎng)站名叫 flourish,網(wǎng)址:https://flourish.studio/examples/

flourish 最終生成效果也非常不錯(cuò),但缺點(diǎn)是需要微調(diào)大量參數(shù)

好了,關(guān)于排序圖的制作就介紹到這里了,如果內(nèi)容對(duì)你有幫助的話不妨點(diǎn)個(gè)贊來(lái)鼓勵(lì)一下我~

 

責(zé)任編輯:武曉燕 來(lái)源: 小張Python
相關(guān)推薦

2022-07-27 08:16:22

搜索引擎Lucene

2022-12-07 08:42:35

2021-12-06 18:22:15

數(shù)據(jù)項(xiàng)目技術(shù)

2021-01-27 21:55:13

代碼參數(shù)值ECharts

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機(jī)

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-04-28 09:23:36

REST

2022-02-16 16:24:05

HarmonyOS鴻蒙操作系統(tǒng)

2009-08-27 18:10:58

PHP繪制3D圖形

2022-05-10 10:43:35

數(shù)據(jù)源動(dòng)態(tài)切換Spring

2014-08-08 13:22:54

測(cè)試手機(jī)站點(diǎn)移動(dòng)設(shè)備

2022-06-06 08:50:40

CIOIT轉(zhuǎn)型

2021-01-19 09:06:21

MysqlDjango數(shù)據(jù)庫(kù)

2021-11-09 06:55:03

水印圖像開發(fā)

2010-07-06 09:43:57

搭建私有云

2010-07-06 09:38:51

搭建私有云

2021-09-26 16:08:23

CC++clang_forma

2021-01-21 09:10:29

ECharts柱狀圖大數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩精品视频在线免费观看 | 亚洲欧美久久 | 精品日韩 | 欧美视频一级 | www.日本三级 | 久草视频在线播放 | 红桃成人在线 | 中文字幕日韩av | 国产乱码久久久久久 | 99re视频精品 | 国产成人jvid在线播放 | 日本在线中文 | 免费v片在线观看 | 亚洲精品一区二区在线观看 | 日韩av福利在线观看 | 日韩成人在线观看 | 高清人人天天夜夜曰狠狠狠狠 | 午夜在线小视频 | 一区二区精品 | 色综合视频 | 久久免费资源 | www.日韩在线 | 国产高清视频在线观看 | 免费国产视频在线观看 | 久久天天躁狠狠躁夜夜躁2014 | 午夜欧美日韩 | 亚洲av一级毛片 | 色久在线 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 国产综合久久 | аⅴ资源新版在线天堂 | 亚洲精品日韩一区二区电影 | 国产一区二区三区四区 | 天堂一区在线观看 | 二区欧美| 中文字幕免费视频 | 99re66在线观看精品热 | aaaaaa大片免费看最大的 | 视频一区二区在线观看 | 久久久免费电影 | 人人玩人人干 |