1. 程式人生 > >Canvas之畫多個折線圖

Canvas之畫多個折線圖

<canvas id="a_canvas" width="850" height="450" ></canvas>
<script>
			var a_canvas;
			var a_context;

			var b_canvas;
			var b_context;

			window.onload = function() {
				a_canvas = document.getElementById('a_canvas');
				if(a_canvas && a_canvas.getContext) {
					a_context = a_canvas.getContext('2d');
				}

				b_canvas = document.getElementById('b_canvas');
				if(b_canvas && b_canvas.getContext) {
					b_context = b_canvas.getContext('2d');
				}

				a_centerX = a_canvas.width / 3, //Canvas三分之一x軸座標
					a_centerY = a_canvas.height / 2, //Canvas中心點y軸座標
					rad = Math.PI * 2 / 100, //將360度分成100份,那麼每一份就是rad度

					whiteCircle(a_context, a_centerX, a_centerY);
				text(a_context, a_centerX, a_centerY);
				list(a_context, a_centerX, a_centerY);
				
				var white_data = [17, 3, 15, 5, 14, 3, 27, 5];
				var yellow_data = [10, 13, 5, 5, 4, 13, 27, 15];
				var white="white";
				var yellow="yellow";
				lineChart(b_context,b_canvas,white_data,white);//context,canvas,data,color
				lineChart(b_context,b_canvas,yellow_data,yellow);
			}
			//繪製內圈
			function whiteCircle(context, centerX, centerY) {
				context.save();
				context.beginPath();
				context.radius = 80;
				context.lineWidth = 80;
				context.strokeStyle = "#81EF7D";
				context.arc(centerX, centerY, 170, 0, Math.PI * 2, false);
				context.stroke();
				context.closePath();
				context.restore();
			}
			//文字繪製
			function text(context, centerX, centerY) {
				context.save(); //save和restore可以保證樣式屬性只運用於該段canvas元素
				context.strokeStyle = "#81EF7D"; //設定描邊樣式
				context.fillStyle = "#1DABE2";

				context.font = "80px sans-serif"; //設定字型大小和字型

				//繪製字型,並且指定位置
				context.fillText("0", centerX - 20, centerY - 10);
				context.font = "40px sans-serif";
				context.fillText("延誤總數", centerX - 75, centerY + 40);
				context.stroke(); //執行繪製
				context.restore();
			}

			function list(context, centerX, centerY) {

				context.save(); //save和restore可以保證樣式屬性只運用於該段canvas元素
				context.beginPath();
				context.arc(centerX * 3 * 0.9 - 20, centerY * 2 * 0.9 - 10, 10, 0, 360, false);
				context.fillStyle = "#81EF7D";
				context.fill();
				context.closePath();
				context.strokeStyle = "#81EF7D"; //設定描邊樣式
				context.fillStyle = "black";
				context.font = "30px sans-serif";
				context.fillText("其他", centerX * 3 * 0.9, centerY * 2 * 0.9);

				context.stroke(); //執行繪製
				context.restore();
			}
			function lineChart(context,canvas,data,color) {
				
				// 繪製背景
				var gradient = context.createLinearGradient(0, 0, 0, 300);

				context.fillStyle = gradient;

				context.fillRect(0, 0, canvas.width, canvas.height);

				// 描繪邊框
				var grid_cols = data.length + 1;
				var grid_rows = 8;
				var cell_height = canvas.height / grid_rows;
				var cell_width = canvas.width / grid_cols;
				context.lineWidth = 1;
				context.strokeStyle = "#a0a0a0";

				var max_v = 60;

				for(var i = 0; i < data.length; i++) {
					var d = 0;
					if(data[i] < 0) {
						d = d - data[i];
					} else { d = data[i]; };
					if(d > max_v) { max_v = d };
				}
				max_v = max_v * 1.0;
				// 將資料換算為座標
				var points = [];
				for(var i = 0; i < data.length; i++) {
					var v = data[i];
					var px = cell_width *  (i + 1);
					var py = canvas.height - canvas.height * (v / max_v);
					points.push({ "x": px, "y": py });
				}

				

				// 繪製折現
				context.beginPath();
				context.moveTo(points[0].x, points[0].y);
				for(var i = 1; i < points.length; i++) {
					context.lineTo(points[i].x, points[i].y);
				}

				context.lineWidth = 4;
				context.strokeStyle = color;
				context.stroke();

				//繪製座標圖形
				for(var i in points) {
					if(i < 19) {
						var p = points[i];

						context.beginPath();
						context.lineWidth = 4;
						context.radius = 4;
						context.strokeStyle = "white";
						context.fillStyle = color;
						context.arc(p.x, p.y, 7, 0, Math.PI * 2, false);

						context.stroke();
						context.fill();
						context.closePath();
					} else {

					}

				}

			}
		</script>



三,Demo地址(該demo還包換圓環,柱狀圖等等)

相關推薦

Canvas折線

<canvas id="a_canvas" width="850" height="450" ></canvas><script> var a_canvas; var a_context; var b_canvas; var b_context;

php結合echarts折線

echarts是百度出的一個畫圖工具基本上是js寫出來的,對於php來生成一個折線圖或者餅圖這些資料視覺化來說是相當的方便。在工作中也會常遇到資料視覺化的東西,一些簡單的圖可以用echarts特別的方便。還有hcharts這種的。今天我們以echarts來做例子。下面直接上程

用R語言在同一副裡面折線的注意事項

setwd("C:/Users/11565/Desktop/合併二") shuju <- read.csv("資料.csv",header = T) library(psych) head(shuju) attach(shuju) head(mtcars) aggreg

ECharts折線動態獲取json資料

ECharts 多個折線圖動態獲取json資料效果圖如下:一.html部分<p id="TwoLineChart" style="width:100%; height:400px;"></p>二.js部分<script type="text/Ja

[work] matplotlib 曲線的折線

這裡我利用的是matplotlib.pyplot.plot的工具來繪製折線圖,這裡先給出一個段程式碼和結果圖: # -*- coding: UTF-8 -*- import numpy as np import matplotlib as mpl import matplotlib.pypl

JEPLUS圖表引擎系列折線—JEPLUS軟件快速開發平臺

FQ 初級 -- 邊框顏色 javascrip 修改 not 自定義圖表 title JEPLUS圖表引擎之多系列折線圖一、效果展示二、準備工作JEPLUS平臺版本:5.0.0.1Eclipse版本:4.3以上 Intellij IDEA : 2015以上,推薦

同一介面QQ(R語言)

題目:一名研究者用光子吸收法測量了婦女骨骼中無機物含量,對三根骨頭主側和非主側記錄了測量值,資料框“T1bones.txt”中的第2至第7列記錄了相應資料。對各個變數做qq圖,在同一個介面畫出所有的qq圖,不同的qq圖用不同顏色表示。 檔案:T1bones.txt 受試者編號&n

R語言:如何在一張填色等值線

  在R語言:填色等值線圖及其色標(color bar)設定中我們介紹了filled.contour函式的用法,它可以很方便的繪製帶色標的填色等值線圖。但是我們平時可能更多的需要將多個填色圖放在同一張圖上(如下圖所示),這種圖該如何繪製?   相比R語言:填色等值線圖及其

KVO---視間數據的傳遞:標簽顯示輸入的內容【中】

tla trac content color smis rep ret oot ani RootViewController.m #import "ModalViewController.h" @interface RootViewController () @en

單例---視間數據的傳遞:標簽顯示輸入的內容【中】

release 視圖 pro button data- pos view copy field RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.view.

mybatis 引入model

tar integer row 根據 引入 upd edi .org 關聯 配置hessian: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//m

Exchange Server 2016管理系列課件45.DAG部署建立DAG組

Exchange Server 郵件服務器 DAG管理 多DAG管理 方式方法是一樣的,比如我建了三個DAG組,對應的有三個DAG的計算機名稱。每個DAG群集都對應有自己的IP到故障轉移群集管理器中,可以看到DAG相關的群集資源。註意:群集管理器裏面的東西看看可以,但是不建議在群集管理器中隨意

k8spod掛載點寫法

path yam mes mem data mount docke k8s volumes docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/ngin

近期處理Highcharts標時,碰到重復操作,所以編寫了一個流程控制器

null sql 控制 lin end created 格式 har 合並數組 HTML選擇頁面 第一部分:<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/9/8 * Tim

linux 核心模組程式設計編譯原始檔(三)

編譯擁有多個原始檔的核心模組的方式和編譯一個原始檔的方式差不多,我們先來看下我們需要的檔案都有哪些。 首先是main.c檔案 #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE

MatlabFigure合成一個Fig

Matlab多個Figure圖合成一個Fig 轉自:http://jacoxu.com/matlab%E5%A4%9A%E4%B8%AA%E5%B7%B2figure%E5%9B%BE%E5%90%88%E6%88%90%E4%B8%80%E4%B8%AA/ 案例:之前跑過的程式 已經生

微信小程式Canvs資料表格 折線

微信小程式Canvs畫資料表格 應設計要求,需要畫個圖示來顯示使用者歷史資料的變化,所以就寫了個方法,方便自己以後用的時候呼叫 廢話不多說,先上效果圖 現在.wxml檔案中加入canvas 標籤 給他一個canvas-id屬性,js中獲取上

(譯)Effective Kotlin系列遇到構造器引數要考慮使用Builder(二)

翻譯說明: 原標題: Effective Java in Kotlin, item 2: Consider a builder when faced with many constructor parameters 原文地址: https://blog.kotlin-academy.

android——CMakeList配置編譯.cpp檔案

上次提到AndroidStudio2.2進行NDK開發超方便的配置方式,不用進行Android.mk 配置,也不用進行Application.mk配置,只要配置CMakeList即可。那麼問題來了,通過該方式生成的配置檔案預設是隻native-lib.cpp一個cpp檔案的,那麼怎麼配置編譯多個.c

react應用類名

react開發過程中,經常會需要動態向元素內新增樣式style或className,那麼應該如何動態新增呢??? 一、react向元素內,動態新增style 例如:有一個DIV元素, 需要動態新增一個 display:block | none 樣式, 那麼: <div s