|
展示圖:
JavaScript SVG 繪製 pieChart 圓餅圖
程式碼
- <div id="chart"></div>
- <script>
- /**
- * 建立SVG元素,並繪製一個圓餅圖
- * width, height: 此SVG圖形大小,單位是像素(pixels)
- * cx, cy, r : 此圓餅中心和半徑
- * lx, ly : piechart的左上角
- * data : 一個物件,其特性名稱是資料標籤(data labels), 而特性值是每個標籤關聯的值
- *
- * 此函式迴船SVG元素,呼叫者必須把她插入到文件中,使他變得可見
- */
- function pieChart(options) {
- let {width, height, cx, cy, r, lx, ly, data} = options;
- // svg元素的XML命名空間
- let svg = "http://www.w3.org/2000/svg";
- //創建SVG元素,並指出像素大小與使用者座標
- let chart = document.createElementNS(svg, "svg");
- chart.setAttribute("width", width);
- chart.setAttribute("height", height);
- chart.setAttribute("viewBox", `0 0 ${width} ${height}`);
- //定義文字樣式
- chart.setAttribute("font-family", "sans-serif");
- chart.setAttribute("font-size", "18")
- //以陣列方式取得那些標籤和值,並加總那些值
- //以知道這圓餅有多大
- let labels = Object.keys(data);
- let values = Object.values(data);
- let total = values.reduce((x,y) => x+y);
- //為所有切片找出角度。切片i起始於angles[i]
- //結束於angles[i+1]。弧度(radians)
- let angles = [0];
- values.forEach((x,i) => angles.push(angles[i] + x/total * 2 * Math.PI));
- // 現在以迴圈跑過此圓餅的切片
- values.forEach((value, i) => {
- //計算切片與圓相交的兩點位置
- let x1 = cx + r * Math.sin(angles[i]);
- let y1 = cy - r * Math.cos(angles[i]);
- let x2 = cx + r * Math.sin(angles[i+1]);
- let y2 = cy - r * Math.cos(angles[i+1]);
- let big = (angles[i+1] - angles[i] > Math.PI) ? 1 : 0;
-
- // 此字串描述如何繪製圓餅圖的一個切片
- let path = `M${cx},${cy}` + `L${x1},${y1}` + `A${r},${r} 0 ${big} 1` + `${x2},${y2}` + "Z";
- // 大約15個顏色
- let color = `hsl(${(i*40)%360},${90-3*i}%,${50+2*i}%)`;
- let slice = document.createElementNS(svg , "path");
- slice.setAttribute("d", path);
- slice.setAttribute("fill", color);
- slice.setAttribute("stroke", "black");
- slice.setAttribute("stroke-width", "1");
- chart.append(slice);
-
- //繪製為該值一個對應小方形
- let icon = document.createElementNS(svg, "rect");
- icon.setAttribute("x", lx);
- icon.setAttribute("y", ly+30*i);
- icon.setAttribute("width", 20);
- icon.setAttribute("height", 20);
- icon.setAttribute("fill", color);
- icon.setAttribute("stroke", "black");
- icon.setAttribute("stroke-width", "1");
- chart.append(icon);
-
- //新增標籤到小方形右邊
- let label = document.createElementNS(svg, "text");
- label.setAttribute("x", lx + 30);
- label.setAttribute("y", ly +30*i +16);
- label.append(`${labels[i]} ${value}`);
- chart.append(label);
- });
- return chart;
- }
- document.querySelector("#chart").append(pieChart({
- width:640, height: 400, cx:200, cy:200, r:180, lx:400, ly:10,
- data:{
- "JavaScript" : 71.5,
- "Java": 45.4,
- "Bash/Shell": 40.4,
- "Python" : 37.9,
- "C#" : 35.3,
- "PHP" : 31.4,
- "C++" : 24.6,
- "C" : 22.1,
- "TypeScript" : 18.3,
- "Ruby" : 10.3,
- "Swift" : 8.3,
- "Obiective-C" : 7.3,
- "Go" : 7.2,
- }
- }));
- </script>
複製代碼
|
|