说明
【跟月影学可视化】学习笔记。
QCharts 图表库
QCharts 是一个基于 spritejs 封装的图表库,可以让用户以组件的形式组合出各种图表:https://www.qcharts.cn/#/home
QCharts 图表的基本用法
最简单的方式是,直接通过 CDN,用 script 标签来加载 SpriteJS 和 QCharts 打包好的文件。
<script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script>
<script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script>
QCharts 图表由图表(Chart)对象及其子元素构成。图表对象的子元素包含:
- 图形(Visual):必选元素
- 其他插件(Plugin):可选元素
基本用法:
- 创建一个图表对象
- 将数据内容与图表对象通过
chart.source
方法绑定起来 - 给图表指定图形
- 使用
chart.append
将它添加到 chart 对象的子元素中
QCharts 绘制折线图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制折线图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Line, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "05-01", catgory: "图例一", sales: 15.2 },{ date: "05-02", catgory: "图例一", sales: 39.2 },{ date: "05-03", catgory: "图例一", sales: 31.2 },{ date: "05-04", catgory: "图例一", sales: 65.2 },{ date: "05-05", catgory: "图例一", sales: 55.2 },{ date: "05-06", catgory: "图例一", sales: 75.2 },{ date: "05-07", catgory: "图例一", sales: 95.2 },{ date: "05-08", catgory: "图例一", sales: 100 },];chart.source(data, {row: "catgory",value: "sales",text: "date",});const line = new Line();const axisBottom = new Axis().style("grid", false);const axisLeft = new Axis({ orient: "left" }).style("axis", false);const legend = new Legend();const tooltip = new Tooltip();chart.append([line, axisBottom, axisLeft, legend, tooltip]);</script></body>
</html>
QCharts 绘制面积图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制面积图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Area, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "05-01", catgory: "图例一", sales: 15.2 },{ date: "05-02", catgory: "图例一", sales: 39.2 },{ date: "05-03", catgory: "图例一", sales: 31.2 },{ date: "05-04", catgory: "图例一", sales: 65.2 },{ date: "05-05", catgory: "图例一", sales: 55.2 },{ date: "05-06", catgory: "图例一", sales: 75.2 },{ date: "05-07", catgory: "图例一", sales: 95.2 },{ date: "05-08", catgory: "图例一", sales: 100 },];chart.source(data, {row: "catgory",value: "sales",text: "date",});const area = new Area();const axisBottom = new Axis().style("grid", false);const axisLeft = new Axis({ orient: "left" }).style("axis", false);const legend = new Legend();const tooltip = new Tooltip();chart.append([area, axisBottom, axisLeft, legend, tooltip]);</script></body>
</html>
QCharts 绘制柱状图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制柱状图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Bar, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "05-01", catgory: "图例一", sales: 15.2 },{ date: "05-02", catgory: "图例一", sales: 39.2 },{ date: "05-03", catgory: "图例一", sales: 31.2 },{ date: "05-04", catgory: "图例一", sales: 65.2 },{ date: "05-05", catgory: "图例一", sales: 55.2 },{ date: "05-06", catgory: "图例一", sales: 75.2 },{ date: "05-07", catgory: "图例一", sales: 95.2 },{ date: "05-08", catgory: "图例一", sales: 100 },];chart.source(data, {row: "catgory",value: "sales",text: "date",});const bar = new Bar();const axisBottom = new Axis().style("grid", false);const axisLeft = new Axis({ orient: "left" }).style("axis", false);const legend = new Legend();const tooltip = new Tooltip();chart.append([bar, axisBottom, axisLeft, legend, tooltip]);</script></body>
</html>
QCharts 绘制饼图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制饼图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Pie, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "05-01", sales: 15.2 },{ date: "05-02", sales: 39.2 },{ date: "05-03", sales: 31.2 },{ date: "05-04", sales: 65.2 },{ date: "05-05", sales: 55.2 },{ date: "05-06", sales: 75.2 },{ date: "05-07", sales: 95.2 },{ date: "05-08", sales: 100 },];chart.source(data, {row: "date",value: "sales",text: "date",});const pie = new Pie();const legend = new Legend();const tooltip = new Tooltip();chart.append([pie, legend, tooltip]);</script></body>
</html>
QCharts 绘制雷达图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制雷达图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Radar, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "血量", category: "德玛西亚盖伦", sales: 120 },{ date: "攻击", category: "德玛西亚盖伦", sales: 140 },{ date: "魔法", category: "德玛西亚盖伦", sales: 100 },{ date: "蓝条", category: "德玛西亚盖伦", sales: 95 },{ date: "防御", category: "德玛西亚盖伦", sales: 160 },{ date: "魔抗", category: "德玛西亚盖伦", sales: 100 },];chart.source(data, {row: "category",value: "sales",text: "date",});const radar = new Radar().style("scale", false);radar.style("section", (d) => ({ opacity: 0.3 }));const legend = new Legend({ align: ["center", "90%"] });const tooltip = new Tooltip();chart.append([radar, legend, tooltip]);</script></body>
</html>
QCharts 绘制仪表盘
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制仪表盘</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Gauge } = qcharts;const chart = new Chart({ container: "#app" });const gauge = new Gauge({min: 0,max: 100,percent: 50,lineWidth: 20,tickStep: 10,});gauge.style("title", { fontSize: 36 });chart.append(gauge);</script></body>
</html>
QCharts 绘制玉玦图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制玉玦图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, RadialBar, Legend, Tooltip } = qcharts;const chart = new Chart({container: "#app",});const data = [{type: "苹果",count: 1111,},{type: "香蕉",count: 2222,},{type: "梨子",count: 3333,},{type: "草莓",count: 4444,},{type: "芒果",count: 5555,},{type: "榴莲",count: 6666,},].sort((a, b) => a.count - b.count);chart.source(data, {row: "type",text: "type",value: "count",});const radialBar = new RadialBar({min: 0,max: 10000,radius: 0.6,innerRadius: 0.1,lineWidth: 10,});radialBar.style("arc", { lineCap: "round" });const legend = new Legend({orient: "vertical",align: ["30%", "center"],});chart.append([radialBar, legend, new Tooltip()]);</script></body>
</html>
QCharts 绘制南丁格尔玫瑰图
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制南丁格尔玫瑰图</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, PolarBar, Tooltip, Legend } = qcharts;const chart = new Chart({container: "#app",});const data = [{product: "05-08",year: "图例一",sales: 30,},{product: "05-08",year: "图例二",sales: 15,},{product: "05-08",year: "图例三",sales: 20,},{product: "05-09",year: "图例一",sales: 30,},{product: "05-09",year: "图例二",sales: 17,},{product: "05-09",year: "图例三",sales: 20,},{product: "05-10",year: "图例一",sales: 17.57,},{product: "05-10",year: "图例二",sales: 24,},{product: "05-10",year: "图例三",sales: 37.54,},{product: "05-11",year: "图例一",sales: 41,},{product: "05-11",year: "图例二",sales: 28,},{product: "05-11",year: "图例三",sales: 21,},{product: "05-12",year: "图例一",sales: 14,},{product: "05-12",year: "图例二",sales: 25,},{product: "05-12",year: "图例三",sales: 35,},{product: "05-13",year: "图例一",sales: 44,},{product: "05-13",year: "图例二",sales: 25,},{product: "05-13",year: "图例三",sales: 10,},{product: "05-14",year: "图例一",sales: 25,},{product: "05-14",year: "图例二",sales: 25,},{product: "05-14",year: "图例三",sales: 10,},{product: "05-15",year: "图例一",sales: 25,},{product: "05-15",year: "图例二",sales: 25,},{product: "05-15",year: "图例三",sales: 10,},];chart.source(data, {row: "year",value: "sales",text: "product",});const bar = new PolarBar({stack: true,radius: 0.8,groupPadAngle: 15,}).style("pillar", {strokeColor: "#FFF",lineWidth: 1,});const tooltip = new Tooltip();const legend = new Legend({orient: "vertical",align: ["30%", "center"],});chart.append([bar, tooltip, legend]);</script></body>
</html>
QCharts 绘制图表组合
绘制图表组合最简单的情况是用相同的图形来绘制不同的变量。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制图表组合</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Line, Legend, Tooltip, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "1月", catgory: "降水量", val: 15.2 },{ date: "2月", catgory: "降水量", val: 19.2 },{ date: "3月", catgory: "降水量", val: 11.2 },{ date: "4月", catgory: "降水量", val: 45.2 },{ date: "5月", catgory: "降水量", val: 55.2 },{ date: "6月", catgory: "降水量", val: 75.2 },{ date: "7月", catgory: "降水量", val: 95.2 },{ date: "8月", catgory: "降水量", val: 135.2 },{ date: "9月", catgory: "降水量", val: 162.2 },{ date: "10月", catgory: "降水量", val: 32.2 },{ date: "11月", catgory: "降水量", val: 32.2 },{ date: "12月", catgory: "降水量", val: 15.2 },{ date: "1月", catgory: "气温", val: 2.2 },{ date: "2月", catgory: "气温", val: 3.2 },{ date: "3月", catgory: "气温", val: 5.2 },{ date: "4月", catgory: "气温", val: 6.2 },{ date: "5月", catgory: "气温", val: 8.2 },{ date: "6月", catgory: "气温", val: 15.2 },{ date: "7月", catgory: "气温", val: 25.2 },{ date: "8月", catgory: "气温", val: 23.2 },{ date: "9月", catgory: "气温", val: 24.2 },{ date: "10月", catgory: "气温", val: 16.2 },{ date: "11月", catgory: "气温", val: 12.2 },{ date: "12月", catgory: "气温", val: 6.6 },];chart.source(data, {row: "catgory",value: "val",text: "date",});const line = new Line({ axisGap: true });const axisBottom = new Axis().style("grid", false);const axisLeft = new Axis({ orient: "left" }).style("axis", false);const legend = new Legend();const tooltip = new Tooltip();chart.append([line, axisBottom, axisLeft, legend, tooltip]);</script></body>
</html>
如果想用不同类型的图形来展示多个变量,在 QCharts 中,我们只需要创建多个不同的图形对象,然后把它们都添加到 chart 对象的子元素中去即可。
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>QCharts 绘制图表组合2</title><style>html,body {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}#app {width: 100%;height: 100%;border: 1px dashed salmon;}</style></head><body><div id="app"></div><script src="https://unpkg.com/spritejs/dist/spritejs.min.js"></script><script src="https://unpkg.com/@qcharts/core@1.0.25/dist/index.js"></script><script>const { Chart, Line, Bar, Legend, Axis } = qcharts;const chart = new Chart({container: "#app",});const data = [{ date: "1月", catgory: "降水量", val: 15.2 },{ date: "2月", catgory: "降水量", val: 19.2 },{ date: "3月", catgory: "降水量", val: 11.2 },{ date: "4月", catgory: "降水量", val: 45.2 },{ date: "5月", catgory: "降水量", val: 55.2 },{ date: "6月", catgory: "降水量", val: 75.2 },{ date: "7月", catgory: "降水量", val: 95.2 },{ date: "8月", catgory: "降水量", val: 135.2 },{ date: "9月", catgory: "降水量", val: 162.2 },{ date: "10月", catgory: "降水量", val: 32.2 },{ date: "11月", catgory: "降水量", val: 32.2 },{ date: "12月", catgory: "降水量", val: 15.2 },{ date: "1月", catgory: "气温", val: 2.2 },{ date: "2月", catgory: "气温", val: 3.2 },{ date: "3月", catgory: "气温", val: 5.2 },{ date: "4月", catgory: "气温", val: 6.2 },{ date: "5月", catgory: "气温", val: 8.2 },{ date: "6月", catgory: "气温", val: 15.2 },{ date: "7月", catgory: "气温", val: 25.2 },{ date: "8月", catgory: "气温", val: 23.2 },{ date: "9月", catgory: "气温", val: 24.2 },{ date: "10月", catgory: "气温", val: 16.2 },{ date: "11月", catgory: "气温", val: 12.2 },{ date: "12月", catgory: "气温", val: 6.6 },];chart.source(data, {row: "catgory",value: "val",text: "date",});const ds = chart.dataset;const d1 = ds.selectRows("降水量");const line = new Line({ axisGap: true }).source(d1).style("point", { strokeColor: "#fff" });const axisLeft = new Axis({orient: "left",formatter: (val) => {return `${val} ml`;},}).style("axis", false).style("scale", false).source(d1);const d2 = ds.selectRows("气温");const bar = new Bar().source(d2);bar.style("pillar", { fillColor: "salmon" });const axisRight = new Axis({orient: "right",formatter: (val) => {return `${val} °C`;},}).style("axis", false).style("scale", false).source(d2);const axisBottom = new Axis().style("scale", true).style("grid", false);const legend = new Legend({ align: ["center", "bottom"] }).style("point", (i, j, k) => {return {borderRadius: 10,bgcolor: k === 0 ? "#47A1FF" : "salmon",};}).style("text", { fontSize: 12 });chart.append([bar, line, axisBottom, axisLeft, axisRight, legend]);</script></body>
</html>