日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JS使用canvas技術模仿echarts柱狀圖

瀏覽:281日期:2024-03-30 08:32:00

canvas 畫布是html5中新增的標簽,可以通過js操作 canvas 繪圖 API在網頁中繪制圖像。

百度開發了一個開源的可視化圖表庫ECharts,功能非常強大,可以實現折線圖、柱狀圖、散點圖、餅圖、K線圖、地圖等多種圖表。很多項目都有使用過ECharts開發過圖表功能。

本實例教程使用原生js教你開發一個仿ECharts的柱狀圖。學習本教程之前,讀者需要具備html和css技能,同時需要有簡單的JavaScript基礎。

按照ECharts的開發方法,圖表都是生成在一個HTML元素中。所以本實例中也先準備一個id名為canvasWrap的div元素,如下所示:

<div id='canvasWrap'></div>

然后在canvasWrap元素中創建canvas元素,再在canvas元素上繪制柱狀圖。開發之前,按照慣例,還是先分析柱狀圖的具體操作,再根據具體操作把實現功能的方法分成多個步驟,接下來一個步驟一個步驟去完成它。

1. 編寫柱狀圖數據2. 獲取canvasWrap元素及寬高3. 創建繪圖環境3.1 創建canvas畫布3.2 設置canvas畫布的寬度和高度3.3 將canvas畫布放入到canvasWrap元素中3.4 創建繪圖上下文環境4. 設定坐標區域5. 繪制x軸5.1 繪制軸線5.2 繪制刻度線5.3 繪制刻度名稱6. 繪制y軸6.1 繪制軸線6.2 繪制刻度線6.3 繪制刻度值6.4 繪制x軸網格線7. 繪制柱圖7.1 計算柱圖寬度7.2 計算柱圖高度7.3 計算柱圖X起點7.4 計算柱圖Y起點7.5 繪制柱圖

具體代碼如下:

//1 編寫柱狀圖數據option = { //x軸數據 xAxis: { data: [’Mon’, ’Tue’, ’Wed’, ’Thu’, ’Fri’, ’Sat’, ’Sun’] }, //柱圖數據 series: [{ //多寫幾組數據,用于查看不同數據時的圖表效果 // data: [0.01, 0.2, 0.05, 0.07, 0.04, 0.13, 0.9], // data: [1, 1, 5, 7, 4, 1, 9], // data: [1213, 30, 150, 80, 70, 910, 630], data: [120, 199, 150, 180, 70, 110, 130], //圖形樣式:柱圖 type: ’bar’ }]};//創建圖表函數,wrap:圖表父元素id;data:圖表數據function fnCharts(wrap,data){ //2.獲取canvasWrap元素 var eWrap = document.getElementById(wrap); //2.獲取canvasWrap元素寬度和高度,用于設置canvas畫布大小 var nWrapW = eWrap.offsetWidth; var nWrapH = eWrap.offsetHeight; //3.1 創建canvas畫布 var eCanvas = document.createElement(’canvas’); //3.2 設置canvas畫布的寬度和高度 eCanvas.width = nWrapW; eCanvas.height = nWrapH; //3.3 將canvas畫布放入到canvasWrap元素中 eWrap.appendChild(eCanvas); //3.4 創建繪圖上下文環境(才能夠在Canvas畫布上繪制) var oCtx = eCanvas.getContext(’2d’); //4.設定坐標區域左上角和右下角 //起點設置為50.5,而不是整數,是為了讓線條變清晰 var nZoneStartX = 50.5; var nZoneStartY = 50.5; var nZoneEndX = nWrapW - nZoneStartX; var nZoneEndY = nWrapH - nZoneStartY; //5.1 使用線條函數繪制x軸軸線 fnCreatLine(nZoneStartX,nZoneEndY,nZoneEndX,nZoneEndY); //計算x軸長度 var nLonX = nZoneEndX - nZoneStartX; //獲取x軸數據數組長度 var nDataLon = option.xAxis.data.length; //根據x軸數據數組長度循環,在循環中繪制刻度線和刻度數值名稱 for(let i=0;i<nDataLon;i++){ //計算出x軸刻度線起點在x軸上的值 let nScaleX = nZoneStartX+Math.floor(nLonX*(i/nDataLon)); //刻度線起點都在x軸上 let nScaleY = nZoneEndY; //5.2 繪制刻度線,長度為10 fnCreatLine(nScaleX,nScaleY,nScaleX,nScaleY+10); //從數據中獲取刻度名稱字符串 let sName = option.xAxis.data[i]; //計算出刻度名稱起點 let nNameX = nZoneStartX+Math.floor(nLonX*(i/nDataLon))+Math.floor(nLonX*(1/nDataLon))/2; let nNameY = nZoneEndY+15; //5.3 繪制刻度名稱 fnCreatText(sName,nNameX,nNameY,’#aaa’,’center’); } //6.1 使用線條函數繪制y軸軸線 fnCreatLine(nZoneStartX,nZoneEndY,nZoneStartX,nZoneStartY); //繪制y軸刻度線前,需要有刻度最大值、最小值、刻度線段數和刻度線之間的間隔這些數據。 //刻度最大值先從數組中取最大值,等下再計算應該顯示的最大值 var nMaxScal = Math.max.apply(null,option.series[0].data); //刻度最小值在本實例中取0 var nMinScal = 0; //刻度線段數在本實例中設置為4 var nSplit = 4; //計算刻度間隔值 var nStep = (nMaxScal-nMinScal)/nSplit; //這時候會發現刻度間隔值好像有點奇怪,因為一般圖表的刻度間隔值都是5的倍數, //比如:[0,0.5,1.0,1.5,2]或[0,50,100,150,200]。 //所以還需要進一步計算,看nStep是否是5的倍數,如果不是,則遞增nIncrease,使其達到最接近的5的倍數。 //計算第一步,根據nStep算出倍數值應該是0.5或5或50或... //在本實例中通過把nStep數值先轉換為字符串再進行處理(也可以使用對數和指數去計算)。 var sTemp = ’’ + nStep; //把nStep轉換為字符串 //聲明一個需要遞增的數,默認為1 var nIncrease = 1; //聲明一個變量用于解決小數相乘產生的精度bug var nTempMultiple = 1; //nIncrease取10的n次冪,通過以下判斷計算 if(sTemp.indexOf(’.’)==-1){ //如果nStep不包含小數點,nIncrease取10的sTemp.length-2次冪。 //比如nStep為19的話,nIncrease = 10的0次冪,遞增數為1 //nStep為9的話,nIncrease = 10的-1次冪,遞增數為0.1 //nStep為199的話,nIncrease = 10的1次冪,遞增數為10 nIncrease = Math.pow(10,sTemp.length-2); }else{ //如果nStep包含小數點,nIncrease取10的sTemp整數位-2次冪。 nIncrease = Math.pow(10,sTemp.indexOf(’.’)-2); //這個變量用于解決小數相乘可能產生的精度bug,比如nIncrease是小數的情況 nTempMultiple = Math.pow(10,sTemp.indexOf(’.’)); } //倍數取整,便于遞增,如165改成160,16.5改成16,1.65改成1.6,可通過下列公式實現 nStep = Math.ceil(nStep/nIncrease)*(nIncrease*nTempMultiple)/nTempMultiple; //使用循環遞增nIncrease修正刻度值 while(nStep%(nIncrease*5)!=0){ nStep += nIncrease*1; } //通過間隔值乘以線段數,修改刻度最大值 nMaxScal = nStep * nSplit; //計算y軸長度,這里多減3是因為y軸頂端要留點距離 var nLonY = nZoneEndY - nZoneStartY - 3; //繪制y軸刻度 for(let i=0;i<=nSplit;i++){ //刻度線起點都在y軸上 let nScaleX = nZoneStartX; //計算出y軸刻度線起點在y軸上的值 let nScaleY = nZoneEndY-Math.floor(nLonY*(i/nSplit)); //6.2 繪制刻度線 fnCreatLine(nScaleX,nScaleY,nScaleX-10,nScaleY); //6.3 繪制刻度值 fnCreatText(’’+i*nStep,nScaleX-20,nScaleY,’#333’); if(i!=0){ //6.4 非0位置,繪制x軸網格線 fnCreatLine(nScaleX,nScaleY,nScaleX+nLonX,nScaleY,’#ccc’); } } //7.1 計算柱圖寬度 let nBarWidth = Math.ceil(Math.floor(nLonX*(1/nDataLon))*.8); //遍歷x軸數據 for(let i=0;i<nDataLon;i++){ //7.2 計算柱圖高度 let nBarHeight = nLonY/nMaxScal*option.series[0].data[i]; //7.3 計算柱圖X起點 let nBarStartX = nZoneStartX+Math.floor(nLonX*(i/nDataLon)) +(Math.floor(nLonX*(1/nDataLon))-nBarWidth)/2; //7.4 計算柱圖Y起點 let nBarStartY = nZoneEndY-nBarHeight; //7.5 繪制柱圖 fnCreatRect(nBarStartX,nBarStartY,nBarWidth,nBarHeight); } //繪制線條函數 function fnCreatLine(sX,sY,eX,eY,color=’#000’){ //開始繪制路徑 oCtx.beginPath(); //設置路徑顏色 oCtx.strokeStyle = color; //設置路徑起點和終點,繪制線條 oCtx.moveTo(sX,sY); oCtx.lineTo(eX,eY); //給路徑添加顏色 oCtx.stroke(); } //繪制文字 function fnCreatText(text,x,y,color=’#000’,align=’end’,baseLine=’middle’){ //設置文字顏色 oCtx.fillStyle = color; //設置水平對齊方式 oCtx.textAlign = align; //設置垂直對齊方式 oCtx.textBaseline = baseLine; //繪制文字 oCtx.fillText(text,x,y); } //繪制矩形 function fnCreatRect(x,y,width,height,color=’#a00’){ //設置顏色 oCtx.fillStyle = color; oCtx.fillRect(x,y,width,height); }}//調用圖表函數,并傳入元素id和option數據fnCharts(’canvasWrap’,option);

這篇實例教程可能需要點耐心去讀源碼,如果碰到不明白的地方,可以在不明白的源碼位置輸出值,也許能豁然開朗。

以上就是JS使用canvas技術模仿echarts柱狀圖的詳細內容,更多關于JS使用canvas柱狀圖的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品免费一区二区三区| 中文一区一区三区免费在线观 | 九一成人免费视频| 日韩欧美在线中字| 99精品综合| 性欧美长视频| 日本少妇精品亚洲第一区| 久久国产婷婷国产香蕉| 国产精品调教| 久久97视频| 久久国产直播| 女人av一区| 日本中文字幕视频一区| 久久久久伊人| 欧美二区视频| 91在线成人| 91青青国产在线观看精品| 亚洲福利免费| 日韩av一二三| 日韩欧美一区二区三区在线观看| 99视频一区| 国产精品jk白丝蜜臀av小说| 亚洲成人精品| 一本一道久久a久久| 国产精品视频一区视频二区| 久久97久久97精品免视看秋霞| 99精品视频在线观看免费播放| 亚洲aⅴ网站| 日韩伦理一区| 日本aⅴ免费视频一区二区三区| 超碰成人av| 视频一区日韩精品| 日韩欧美字幕| 欧美日韩伊人| 国模 一区 二区 三区| 亚洲精品视频一二三区| 日韩中文影院| 国产欧美亚洲一区| 黄色免费成人| 日韩视频一二区| 亚洲一级二级| 精品国产欧美日韩| 亚洲一区二区日韩| 欧美天堂视频| 亚洲精品视频一二三区| 精品国模一区二区三区| 日韩高清电影免费| 91精品高清| 国产999精品在线观看| 亚洲精品中文字幕99999| 国产suv精品一区二区四区视频| 麻豆精品91| 日韩精品欧美| 国产精品qvod| 午夜国产精品视频| 亚洲国产福利| 国产精品亚洲综合色区韩国| 六月婷婷一区| 久久精品123| 久久婷婷国产| 欧美日本一区| 中文字幕视频精品一区二区三区| 久久视频国产| 国产成人精品免费视| 欧美在线看片| 蜜桃av一区二区在线观看| 久久要要av| 中文字幕高清在线播放| 国产精品videossex久久发布 | 国产精品精品| 你懂的国产精品| 国产探花一区在线观看| 三级亚洲高清视频| 好吊视频一区二区三区四区| 日韩中文在线电影| 久久久久久婷| 久久字幕精品一区| 国产精品视频一区二区三区| 免费观看久久av| 欧美日韩亚洲在线观看| 亚洲人成在线网站| 亚洲风情在线资源| 国产美女高潮在线观看| 精品在线网站观看| 久久超碰99| 国产欧美日韩影院| 91国内精品| 国产视频一区二区在线播放| 亚洲麻豆一区| 亚洲丝袜啪啪| 六月天综合网| 亚洲日本免费电影| 日韩精品国产欧美| 中文字幕日韩亚洲| 国产高清不卡| 欧美日韩视频一区二区三区| 亚洲精品黄色| 国产精品porn| 国产日本亚洲| 国产精品视频一区二区三区四蜜臂| 日本va欧美va精品发布| 欧美精品中文字幕亚洲专区| 日韩av午夜在线观看| 国产精品亚洲成在人线| 精品国产乱码久久久久久樱花| 日本欧美国产| 亚洲伊人av| 欧美日一区二区| 欧美成人a交片免费看| 精品日韩视频| 欧美中文日韩| 国产日韩1区| 在线中文字幕播放| 亚洲激情另类| 日韩va亚洲va欧美va久久| 国产精品亚洲欧美日韩一区在线| 久久精品国产精品亚洲毛片| 不卡福利视频| 亚洲成人免费| 日本午夜精品一区二区三区电影| 国产精东传媒成人av电影| 亚洲深夜视频| 午夜在线精品| 国产视频一区免费看| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲视频二区| 日本亚洲欧美天堂免费| 国产精品对白| 国产精品成人一区二区不卡| 三上悠亚国产精品一区二区三区| 午夜日韩福利| 日韩不卡在线观看日韩不卡视频| 免费日韩成人| 91精品二区| 欧美日韩免费观看一区=区三区| 亚洲人妖在线| 国产福利片在线观看| 免费观看在线综合色| 欧美黄色一区| 91精品国产91久久久久久黑人| 在线看片日韩| 97精品一区| 日本中文字幕不卡| 亚洲成人av观看| 日韩国产欧美在线视频| 日韩精品网站| 国产日产精品_国产精品毛片| 亚洲人成亚洲精品| 日韩久久视频| 国产一区二区三区四区大秀| 91精品啪在线观看国产18| 91亚洲国产| 亚洲黄色影院| 久久只有精品| 美国三级日本三级久久99| 精品一区二区三区免费看| 99日韩精品| 日韩成人精品一区二区| 日韩精品亚洲专区在线观看| 99久久精品费精品国产| 国产亚洲精品美女久久| 合欧美一区二区三区| 久久精品三级| 日韩免费精品| 欧美激情国产在线| 国产精品羞羞答答在线观看| 美女黄网久久| 99久久亚洲精品| 精品欧美视频| 国产乱人伦丫前精品视频| 免费人成黄页网站在线一区二区| 涩涩av在线| 精品中文字幕一区二区三区 | 日韩免费av| 欧美亚洲二区| 国内精品美女在线观看| 中文字幕日韩亚洲| 久久久成人网| 麻豆国产91在线播放| 日韩激情综合| 视频一区二区欧美| 伊人久久高清| 国产专区精品| 国产精品2023| 欧美日韩一区二区国产| 视频在线观看一区二区三区| 日韩欧美一区二区三区在线观看| 欧美精品91| 国产欧美日韩一区二区三区四区| 亚洲精品永久免费视频| 国产精品videossex| 日韩avvvv在线播放| 免费看的黄色欧美网站| 99在线|亚洲一区二区| 亚洲黄色中文字幕| 国产一区二区三区成人欧美日韩在线观看| 久久国内精品视频| 国产日韩一区| 国产精品黄色片| 麻豆精品视频在线观看|