关于前端绘制图形的一些方法(SVG,D3,Echarts)、Echarts的使用

一、上篇知识点总结

数据可视化常用工具
    容器:canvas  svg
    插件:echarts  highcharts   charts   d3
    
canvas标签
    大小:300*150   单位px
    坐标:起点左上角
    
canvas画图
    画笔:canvas.getContext('2d');
    绘制线段:moveTo()  lineTo()  strokeStyle  stroke()    fillStyle  fill()  lineWidth...
    绘制矩形:rect()  fillRect()   strokeRect()  clearRect()
    绘制圆形:arc(x,y,r,startAng,endAng,bool) Math.PI(180) == π  == 3.14
    绘制文字:font   fillText()  strokeText()  textAlign  ....
    绘制图片  drawImage()  onload
canvas渐变
    线性渐变:linearGradient(x1,y1,x2,y2)
    径向渐变:radialGradient(cx1,cy1,r1,cx2,cy2,r2)
canvas变形
    rotate(弧度)  translate()  scale()  transform()
canvas状态保存和恢复
    save()  restore()

三、SVG(了解)

1svg概述

(1)SVG,Scalable Vector Graphics是一种基于XML的语言,用于定义基于矢量的图形,提供了很多绘图的标签。
(2)作为矢量图像,SVG图像永远不会丢失质量,无论它们如何缩小或调整大小。
(3)SVG图像支持交互和动画。

2 svg容器

2.1大小

默认大小也是300*150 单位px 可以通过width和height属性设置其大小或者css方式调整大小

2.2坐标

坐标同canvas,起点默认在画布的左上

3绘制基本图形

1.<rect>     绘制矩形 
    x,y 矩形绘制的起始位置、 width,height 矩形的宽高、fill颜色值 填充、stroke="颜色" 描边
    stroke-width 线宽 、rx,ry  圆角大小
      
  
2.<circle>   圆形 
        cx,cy,r 圆心和半径
    
3.<line>     线 
    x1,y1  起始点  、   x2,y2   终点
    
    
4.<polyline> 折线 
    points 集合
        ="x1,y1  x2,y2  x3,y3 ..."
        ="x1 y1,x2 y2,..."
            
        
5.<path> 路径
    d 路径数据
    M = moveto
    L = lineto
    Z = closepath
    .....
    
    常用于绘制折线图 面积图
         <path 
            d="M0 0 L200 200 L0 200 z"
            fill="none"
            stroke="red"
        />
            
​
6.<text> 文本
    x="100" 
    y="100" 
    font-size="50" 
    fill="red" 
    font-family="宋体"
    
    水平对齐:text-anchor:start  middle  end
    垂直基线对齐:dominant-baseline:text-after-edge  middle  text-before-edge

代码案例

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>svg</title>
        <style type="text/css">
            svg{background-color: #DDD;}
            /* rect{fill:green} */
        </style>
    </head>
    <body>
        <!-- 大小:300*150(px) css -->
        <svg width='500' height='500'>
            <!-- 1.绘制矩形 柱状图 -->
            <!-- <rect
                x='100'
                y='100'
                width='100'
                height='100'
                fill='red'
                stroke-width='5'
                stroke='red'
                transform='rotate(40)'
            ></rect> -->
            
            <!-- 2.绘制圆形  图形标记 -->
            <!-- <circle
                cx='250'
                cy='250'
                r='200'
                fill='red'
            ></circle> -->
            
            <!-- 3.绘制线段 指引线 -->
            <!-- <line 
                x1='20'
                y1='20'
                x2='200'
                y2='20'
                stroke='red'
            ></line> -->
            
            <!-- 4.绘制折线 polyline 绘制折线图 -->
            <!-- <polyline
                points='50,100 200,200 250,150 300,250'
                fill='none'
                stroke='red'
            ></polyline> -->
            
            <!-- 5.绘制路径 path 折线图 饼图 扇形图  -->
            <!-- <path
                d="M0 0 L200 200 L0 200 z"
            ></path> -->
            
            <!-- 6.绘制文字 -->
            <!-- 水平对齐:text-anchor:start  middle  end
            垂直基线对齐:dominant-baseline:text-after-edge  middle  text-before-edge -->
            <!-- <line
                x1='100'
                y1='100'
                x2='500'
                y2='100'
                stroke='red'
            ></line> -->
            
    <!--        <text
                x='100'
                y='100'
                font-size='50'
                font-family="宋体"
                text-anchor="start"
                dominant-baseline="text-before-edge"
            >hello</text>
            
            <text
                x='300'
                y='100'
                font-size='50'
                font-family="黑体"
                text-anchor="start"
                dominant-baseline="text-before-edge"
                stroke='red'
                stroke-width='2'
                fill='none'
            >world</text> -->
        </svg>
    </body>
</html>
​

4 线性渐变

id       唯一标识
x1,y1    渐变起始的位置   百分比  或者  0-1 小数
x2,y2   渐变结束的位置
​
1.创建线性渐变
<defs>
    <linearGradient id="linear1" x1='0%' y1='0%' x2='100%' y2='100%'>
        <stop  offset="10%" stop-color="red" stop-opacity="0.6" /> 设置颜色
        .....
    </linearGradient>
 </defs>
 
2.使用渐变
<rect x="50" y="50" width="100px" height="100px" style="fill: url(#linear1);"></rect> 

代码案例

<!-- <defs> -->
                <!-- 1.创建线性渐变 -->
                <!-- 角形线性渐变 垂直和水平同canvas-->
               <!-- <linearGradient id="linear1" x1='0%' y1='0%' x2='100%' y2='100%'>
                    <stop  offset="10%" stop-color="red" stop-opacity="0.6" /> 
                    <stop  offset="40%" stop-color="blue" stop-opacity="0.3" /> 
                    <stop  offset="80%" stop-color="orange" stop-opacity="1" /> 
                    <stop  offset="100%" stop-color="pink" stop-opacity="0.8" /> 
                </linearGradient> -->
             </defs> -->
             
            <!-- 2.使用渐变 -->
            <!-- <rect
                x='100'
                y='100'
                width='200'
                height='200'
                fill='url(#linear1)'
            ></rect> -->

5放射性渐变

id     唯一标识
cx,cy  外圆圆心位置
r      外圆半径
fx,fy  内圆圆心
​
1.创建线性渐变
<defs>
    <radialGradient id='radial'  cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
        <stop  offset="10%" stop-color="red" stop-opacity="0.6" />设置渐变色
        .....
    </radialGradient>
 </defs>
 
2.使用渐变
<circle cx=250 cy=250 r=200  fill='url(#radial)'></circle>

代码案例:

<!-- <defs> -->
				<!-- 2.创建径向渐变 -->
				<!-- <radialGradient id='radial'  cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
				    <stop  offset="10%" stop-color="red" stop-opacity="0.6" />
				    <stop  offset="40%" stop-color="blue" stop-opacity="0.3" /> 
				    <stop  offset="80%" stop-color="orange" stop-opacity="1" /> 
				    <stop  offset="100%" stop-color="pink" stop-opacity="0.8" /> 
				</radialGradient>
			 </defs> -->
			 
			<!-- 2.使用渐变 -->
			<!-- <circle
				cx='250'
				cy='250'
				r='200'
				fill='url(#radial)'
			></circle> -->

四、D3.js(了解)

1概念(数据驱动文档)

D3js(Data-Driven Documents),是一个可以基于数据来操作文档的 JavaScript 库。可以帮助你使用 HTML, CSS, SVG 来展示数据。D3 遵循现有的 Web 标准,可以不需要其他任何框架独立运行在现代浏览器中,它结合强大的可视化组件来驱动 DOM 操作。

1.语法层面其借鉴了jquery的链式操作语法
2.D3主要通过svg来绘制图形
3.对开发者要求较高(偏底层),灵活性非常高(功能是一个一个的函数,可以自由组合,没有规则限制)
4.不同版本之间的兼容性比较差(向下兼容)

中文官方网址:https://www.d3js.org.cn/
原官网(国外网站):https://d3js.org/

2安装引用

一种是可以直接引入:

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

另一种是通过npm安装:

npm i  d3@版本号      例如安装3版本:npm  i d3@3  

3D3基本操作

3.1元素选择

1.选择一个元素

d3.select(class|id|元素名称)

2.给元素赋值文本或者标签元素

d3.select().text()

d3.select().html()

3.选择多个元素

d3.selectAll((class|id|元素名称)

 		// 1.选择一个元素
		// d3.select(class|id|元素名称)
		// let div = d3.select('div');
		// let div = d3.select('#box');
		// let div = d3.select('.box');
		// console.log(div);
		
		
		// 2.给元素赋值文本或者标签元素
		// d3.select().text()
		// d3.select('div').text('我是div')
		
		// d3.select().html()
		// d3.select('div').html('<h1>我是标题</h1>')
	
		// 3.选择多个元素
		// d3.selectAll((class|id|元素名称)
		// let ps= d3.selectAll('p');
		// ps[0].forEach((item,index)=>{
		// 	item.innerHTML = index
		// })		

3.2添加和删除元素

1.新增元素

d3.select().insert('新增元素标签名称','参考位置')

d3.select().append('新增元素')

2.删除元素

d3.select().remove()

		// 1.新增元素
		// d3.select().insert('新增元素标签名称','参考位置')
		// d3.select('div').insert('h1','.p2').text('我是h1')
		
		// d3.select().append('新增元素')
		// d3.select('div').append('h2').text('我是h2')
		
		// 2.删除元素
		// d3.select().remove()
		// d3.select('div').remove();		

3.3添加属性

d3.select().attr('属性名称','属性值')

		// d3.select().attr('属性名称','属性值')
		// 在body中创建一个500*500的画布svg
		// d3.select('body').append('svg')
		// .attr('width',500)
		// .attr('height',500)	

3.4绑定数据

1.绑定数组到元素上

d3.selectAll().data()

2.绑定字符串到元素上

d3.selectAll().datum()

		// 1.绑定数组到元素上
		// d3.selectAll().data()
		// let score = [90,60,80];
		
		// d3.selectAll('p').data(score)
		// .text((d,i)=>{
		// 	console.log(d,i);
		// 	return d
		// })
		
		// 2.绑定字符串到元素上
		// d3.selectAll().datum()
		
		// d3.selectAll('p').datum('hello')
		// .text((d,i)=>{
		// 	console.log(d,i);
		// 	return d
		// })		

3.5根据绑定数据动态生成或者删除元素

1.动态创建元素

d3.selectAll().data().enter().append()

2.动态删除元素

d3.selectAll().data().exit().remove()

	// 1.动态创建元素
		// d3.selectAll().data().enter().append()
		
		// 动态创建svg画布
		// let svg = d3.select('body').append('svg')
		// .attr('width',500)
		// .attr('height',500)
		// 根据学员的成绩动态绘制柱状图(rect:x y width  height)
		// let score=[70,90,60,100,50,80];
		// svg.selectAll('rect').data(score).enter().append('rect')
		// .attr('x',(d,i)=>{return 50*i})
		// .attr('y',0)
		// .attr('width',30)
		// .attr('height',(d,i)=>{return d})
		// .attr('fill','steelblue')

		
		
		// 2.动态删除元素
		// d3.selectAll().data().exit().remove()
		let score=[90,100];
		d3.selectAll('p').data(score).exit().remove();

五、Echarts.js

1Echarts概述

ECharts,一个使用 JavaScript 实现的开源可视化库,由百度商业前端数据可视化团队研发的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。
官方网址:http://echarts.apache.org/zh/index.html
echarts社区:https://www.makeapie.com/explore.html

2主要目的

借助图形化的手段,清晰有效地传达与沟通信息,揭示数据中的道理和规律.

3优势

(1)开源软件,提供了非常炫酷的图形界面,尤其是地图,同时还提供了柱状图、折线图、气泡图等。
(2)使用简单,底层用的是javascript封装,可以在html中嵌入图表,直接显示。
(3)兼容性好,基于html5,有着良好的动画渲染效果。

4.Echarts绘制基础柱状图

绘制步骤

1.引入echarts
	第一种使用npm安装:
		 npm install echarts --save
         import * as echarts from 'echarts';
         Vue.prototype.$echarts = echarts;
         
	第二种使用外链引入:  <script src="./echarts.min.js"></script>
		   下载echarts.js文件以外链方式引入:
           官方没有直接下载echarts.js文件这种形式,需要自定义生成echarts.js文件。
           地址:https://echarts.apache.org/zh/builder.html
	
2.创建echarts实例        init()
3.设置绘制图表基本配置     option={图表配置}
4.执行绘图操作            setOption()

5.Echarts基础配置

① title标题组件,包含主标题和副标题
 // 配置标题
        title:{
            link:'http://www.baidu.com',
            text:'学生成绩表',
            textStyle:{
                fontSize:15,
                color:'red'
            },
            subtext:'我是小标题',
            subtextStyle:{
                color:'steelblue'
            },
            borderWidth:1,
            borderColor:'orange',
            borderRadius:15,
            left:80,
            top:20
        },

② xAxis 直角坐标系 grid 中的 x 轴

 // 设置x轴
        xAxis:{
            name:'学员',
            type:'category',
            data:xData,
            axisLine:{show:true},//是否显示坐标轴轴线
            axisTick:{show:true},//是否显示坐标上的刻度
        },


③ yAxis直角坐标系 grid 中的 y 轴
  // 设置y轴
        yAxis:{
            name:'学科',
            type:'value'
        }



④ series 系列列表,每个系列通过 type 决定自己的图表类型
   series:[
            {  
                type:'bar',
                data:yuwenData,
                label:{// 配置描述文本
                    show:true,
                    rotate:40,
                    position:'top'
                },
                barWidth:40,//设置柱的宽度
                itemStyle:{
                    barBorderRadius:[10,10,0,0],//柱状图圆角大小
                    //渐变颜色 了解
                    color:new echarts.graphic.LinearGradient(0,0,0,1,[
                        {
                            offset:0,
                            color:'red'
                        },{
                            offset:1,
                            color:'blue'
                        }
                    ]) 
                },
                markPoint:{//设置标记点  max min
                    data:[
                        {type:'max',name:'最大值'},
                        {type:'min',name:'最小值'}
                    ]
                },
                markLine:{//设置标记线  average
                    data:[
                        {type:'average',name:"平均值"}
                    ]
                }
            }
         ]



⑤ tooltip提示框组件
 // 提示
        tooltip:{
            show:true,
            trigger:'axis',//触发类型 
            triggerOn:'mousemove',//触发条件
            axisPointer:{//指示器
                z:0,
                type:'line',
                lineStyle:{
                    width:60,
                    color:'#EEEEEE'
                }
            }
            // formatter:'{a} {b} {c} ',
            // formatter:function(param){
            //     // console.log(param[0])
            // },
        },



⑥ legend图例组件
 //设置图例 配合series 中的name 使用
        legend:{
            show:true,
            // data:['语文','数学'],
            data:[
                {
                    name:'语文',
                    icon:'circle'
                },
                {
                    name:'数学',
                    icon:'rect'
                }
            ]
   },  



⑦ grid直角坐标系内绘图网格
		grid:{
            show:true,
            left:80,
            top:100,
            width:'auto',
            height:'auto',
            containLabel:true//是否包含坐标轴文字描述
        },   



⑧ 横向柱状图
xAxis和yAxis的type正好相反即可


⑨ color 调色盘
// 调色盘  作用域关系: option.color < series.color < series.itemStyle.color 
        // 如果没有设置颜色则会依次循环从该列表中取颜色作为系列颜色。
        // ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc']
        color: ['orange', 'green', 'blue', 'skyblue', 'purple'],


⑩ toolbox工具栏,可以导出图片
   // 工具配置  
        toolbox:{
            show:true,
            feature:{
                saveAsImage:{},//保存图片
                dataZoom:{},//视图区域缩放
                dataView:{},//数据视图工具
                restore:{},//重置刷新
                magicType:{//图形切换
                    type:['bar','line']
                }
            }          
        },

⑪ echarts事件
// 1.状图绑定点击事件 全部监听 on
    myCharts.on('click', function (arg) {
      console.log(arg)
      console.log('click...')
    }) // 对事件进行监听

    

// 2.柱状图绑定点击事件 监听系列是语文的柱状图
myCharts.on("click",{seriesName:"语文"},(e)=>{
    let { name,value } = e;
    console.log(name,value)
})

// 3.click的事件  接触后无法触发以上click事件
    // myCharts.off('click') 
    
    
// 4.窗口的变化动态改变图表大小(以下是简写方式)
    window.onresize = myCharts.resize;  
    
//5. myCharts.showLoading();  myCharts.hideLoading();

猜你喜欢

转载自blog.csdn.net/qq_48469083/article/details/121840531