• echarts使用


    自己在工作中也是经常用到echarts来实现一些统计功能和效果,在这里对自己使用较多的做歌简单的记录,方便自己后期查阅吧。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>line</title>
        <script src="../echarts.min.js"></script>
    </head>
    <body>
        <div id="main" style="740px; height:400px;"></div>
    </body>
    </html>

    下面所有的例子都是在这个基础上完成的。

    1,饼状图

    1.1基础效果

    <script type="text/javascript">
     var myChart = echarts.init(document.getElementById('main'));
     var option = {
        title : {
            text: '成本分布',
            subtext: '本年度成本统计环形图',
        },
        tooltip : {
            trigger: 'item',
            formatter: "{a} <br/>{b} : {c} ({d}%)"
        },
        legend: {
            orient: 'vertical',
            bottom:'40px',
            left: 'left',
            data: ['物业费','资产采购','食物','房租','加油费','团建','水费','电费','空调费','其他']
        },
        series : [
            {
                name: '成本统计',
                //hover状态下的扇区放大动画效果,默认为true
                hoverAnimation:false,
                type: 'pie',
                radius : '55%',
                center: ['50%', '60%'],
                data:[
                    {value:1700, name:'物业费'},
                    {value:1256, name:'资产采购'},
                    {value:1420, name:'食物'},
                    {value:2843, name:'房租'},
                    {value:801, name:'加油费'},
                    {value:500, name:'团建'},
                    {value:1000, name:'水费'},
                    {value:1400, name:'电费'},
                    {value:2843, name:'空调费'},
                    {value:1801, name:'其他'}
                ]
            }
        ]
    };
     myChart.setOption(option);
    </script>

    1.2图例

     legend用于控制图例效果,包括位置、样式和内容等。

    首先是位置由left、right、top、bottom四个单词或者x和y两个控制,可以是具体的像素值,可以是百分比,还可以是left、center等单词。

     

     其次是布局朝向,由orient来控制,其中vertical表示纵向排列,就是上面例子中的效果,当orient的值为horizontal时,代表横向排列,如下所示:

     然后是样式和内容,默认情况下,图例的颜色和图表的颜色保持一致,由一个带圆角的矩形和名称组成。但是,有的时候,想要改变矩形的大小或者形状,也是可行的。

     

    其中icon表示图例项形状,ECharts 提供的标记类型包括 'circle''rect''roundRect''triangle''diamond''pin''arrow''none'。itemWidth和itemHeight表示图例项形状的大小,itemGap表示相邻图例项的间距,padding表示图例内边距(和css一样,可以是一个值,两个值或者四个值,如果是两个和四个值,需要用数组形式)。另外,width和height表示的是整个图例组件的宽高,和上面的itemWith不同。

     最后是图例文本,支持字符串模板和回调函数两种。

       

       

    2,柱状图

     

     实现上面的效果,需要注意两个点:调色盘颜色减变和横轴文字样式。

    2.1调色盘颜色减变

     上面是个二维数组,内层每项由两个颜色组成,代表每个柱子都是由两个颜色组成,后面的offset则定义了减变的位置,barBorderRadius规定了柱子的圆角。

    稍微修改相关参数,就会得到下面的减变:

     

     2.2横轴文字样式

    默认情况下,横轴文字是水平排列的,当文字较多,排不下的时候,会出现间隔显示:

     为了更好的显示所有的文字,可以纵向排列或者倾斜一定的角度排列。

      

     上面就是将文字倾斜了45度角,就可以展示所有文字了。

       

     这种保持了文字横向排列,只是将索引为奇数的进行了换行。

       

     这种就是将文字纵向排列,但是需要注意的是,当文字过多的时候,需要底部留足够的空间展示文字。

     不管是上面哪种方法,最后一个数据项的文字都会加粗,目前还没有找到解决办法。

    自适应

    在vue项目中使用了echarts,然后设计的是高度固定,宽度50%,这样当屏幕宽度变化的时候,需要图表能随着一起变化。

    首先,需要一个控制响应式的js

    esresize.js
    var EleResize = {
        _handleResize: function (e) {
            var ele = e.target || e.srcElement
            var trigger = ele.__resizeTrigger__
            if (trigger) {
                var handlers = trigger.__z_resizeListeners
                if (handlers) {
                    var size = handlers.length
                    for (var i = 0; i < size; i++) {
                        var h = handlers[i]
                        var handler = h.handler
                        var context = h.context
                        handler.apply(context, [e])
                    }
                }
            }
        },
        _removeHandler: function (ele, handler, context) {
            var handlers = ele.__z_resizeListeners
            if (handlers) {
                var size = handlers.length
                for (var i = 0; i < size; i++) {
                    var h = handlers[i]
                    if (h.handler === handler && h.context === context) {
                        handlers.splice(i, 1)
                        return
                    }
                }
            }
        },
        _createResizeTrigger: function (ele) {
            var obj = document.createElement('object')
            obj.setAttribute('style',
                'display: block; position: absolute; top: 0; left: 0; height: 100%;  100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;')
            obj.onload = EleResize._handleObjectLoad
            obj.type = 'text/html'
            ele.appendChild(obj)
            obj.data = 'about:blank'
            return obj
        },
        _handleObjectLoad: function () {
            this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
            this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize)
        }
    }
    if (document.attachEvent) { // ie9-10
        EleResize.on = function (ele, handler, context) {
            var handlers = ele.__z_resizeListeners
            if (!handlers) {
                handlers = []
                ele.__z_resizeListeners = handlers
                ele.__resizeTrigger__ = ele
                ele.attachEvent('onresize', EleResize._handleResize)
            }
            handlers.push({
                handler: handler,
                context: context
            })
        }
        EleResize.off = function (ele, handler, context) {
            var handlers = ele.__z_resizeListeners
            if (handlers) {
                EleResize._removeHandler(ele, handler, context)
                if (handlers.length === 0) {
                    ele.detachEvent('onresize', EleResize._handleResize)
                    delete ele.__z_resizeListeners
                }
            }
        }
    } else {
        EleResize.on = function (ele, handler, context) {
            var handlers = ele.__z_resizeListeners
            if (!handlers) {
                handlers = []
                ele.__z_resizeListeners = handlers
    
                if (getComputedStyle(ele, null).position === 'static') {
                    ele.style.position = 'relative'
                }
                var obj = EleResize._createResizeTrigger(ele)
                ele.__resizeTrigger__ = obj
                obj.__resizeElement__ = ele
            }
            handlers.push({
                handler: handler,
                context: context
            })
        }
        EleResize.off = function (ele, handler, context) {
            var handlers = ele.__z_resizeListeners
            if (handlers) {
                EleResize._removeHandler(ele, handler, context)
                if (handlers.length === 0) {
                    var trigger = ele.__resizeTrigger__
                    if (trigger) {
                        trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize)
                        ele.removeChild(trigger)
                        delete ele.__resizeTrigger__
                    }
                    delete ele.__z_resizeListeners
                }
            }
        }
    }
    export {
        EleResize
    }

    然后再需要的页面引入这个js

     最后使用就可以了

  • 相关阅读:
    项目一:CRM(客户关系管理系统)--1
    数据库统一API--SQLAlchemy
    消息队列--1--Redis
    消息队列--2--RabbitMQ
    python之路--web--2--Django-11-信号
    python之路--web--2--Django-10--序列化
    python之路--web--2--Django-8-分页
    python之路--web--2--Django-6-Session
    python之路--web--2--Django-5-Cookie
    python之路--web--2--Django-7-跨站请求伪造
  • 原文地址:https://www.cnblogs.com/yuyujuan/p/11546848.html
Copyright © 2020-2023  润新知