JavaScript实现的环形图比较

1,Highcharts

Highcharts 是一个用纯 JavaScript 编写的一个图表库, 能够很简单便捷的在 Web 网站或是 Web 应用程序添加有交互性的图表,并且免费提供给个人学习、个人网站和非商业用途使用。

Highcharts 支持的图表类型有直线图、曲线图、区域图、柱状图、饼状图、散状点图、仪表图、气泡图、瀑布流图等多达 20 种图表,其中很多图表可以集成在同一个图形中形成混合图。

主要优势:兼容性、开源、纯 JavaScript、丰富的图表类型、简单的配置语法、动态交互性、支持多坐标轴等等。

    var chart = null;
    $(function () {
        $('#container').highcharts({
            chart: {
                borderColor: '#E5E8EB',//图表框颜色
                borderWidth: 1,//图表框宽度
                backgroundColor: '#F6F6F6',//图表背景色
                plotBackgroundColor: null,//绘图区无颜色
                plotBorderWidth: null,//绘图区边框宽度
                plotShadow: false,//绘图区阴影效果
                spacing: [100, 20, 100, 20]//图表内边距,上右下左
            },
            colors: [
                '#EFE07C', '#89B5EB', '#F8AA9E', '#FFC7B8', '#F18686', '#EFC27C'
            ],// colors是饼图或者环形图中每一块的颜色
            credits: {
                enabled: false//右下角的版权信息不显示
            },
            title: {
                floating: true,
                text: '<div style="text-align:center" ><img src="http://liuxunming.com/image/avatar.png" width="20px" height="20px" style="vertical-align: middle"/></div>个人简介',//环形图中心显示文字加图片
                useHTML: true,//必须设置true才能加图片
            },
            tooltip: {
                pointFormat: '{series.name}: <b>{point.percentage:.2f}%</b>'
            },//浮动的数据提示框
            plotOptions: {
                pie: {
	                size:200,//环形图大小控制
                    allowPointSelect: true,
                    cursor: 'pointer',
                    dataLabels: {
                        enabled: true,
                        format: '<b>{point.name}</b>: {point.percentage:.2f} %'
                    }
                }
            },
            series: [{
                type: 'pie',
                innerSize: '70%',// 圆环厚度百分比
                name: '占比',//浮动框的文字提示
                showInLegend: true,//显示图例
                data: [
                    ['Firefox', 45.0],
                    ['IE', 26.8],
                    ['Opera', 6.2],
                    ['Opera2', 16.2],
                    ['Opera3', 36.2],
                ]
            }],
            legend: {
                layout: 'horizontal',//图例水平排放,超过宽度后换行
                labelFormat: '{name} {percentage:.2f} %',
                symbolHeight: 8,//图例小标志高度
                symbolWidth: 8,
                width: 220,//图例区宽度
                align: 'center',
                symbolRadius: 0// 图例形状为方形
            },
        }, function (c) {
            // 环形图圆心
            var centerY = c.series[0].center[1],
                titleHeight = parseInt(c.title.styles.fontSize);
            c.setTitle({
                y: centerY + titleHeight / 2
            });
            chart = c;
        });
    });

以上代码效果如下:
这里写图片描述
具体可以到highchart官网的图表编辑区直接粘贴以上代码试试效果,直接替换js内容即可。顺便稍微改一下界面的div大小

<div id="container" style="width:500px;height:600px"></div>

现在还有一个问题亟需解决:

  • 环形图中心的文字加图片如何整体居中

2,iChartJS

ichartjs 是一款基于HTML5的图形库。使用纯javascript语言, 利用HTML5的canvas标签绘制各式图形。 ichartjs致力于为您的应用提供简单、直观、可交互的体验级图表组件。是WEB/APP图表展示方面的解决方案 。如果你正在开发HTML5的应用,ichartjs正好适合您。 ichartjs目前支持饼图、环形图、折线图、面积图、柱形图、条形图。ichartjs是基于Apache License 2.0协议的开源项目。

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: diyangxia
  Date: 2017/4/12
  Time: 15:51
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); 
%>
<html>
<head>
    <title>饼状图显示</title>
    <script type="text/javascript" src="<%=path%>/staticmedia/js/jquery/jquery.1.4.2-min.js"></script>
    <script src="http://www.ichartjs.com/ichart.latest.min.js"></script>
    <script type="text/javascript">
        var path = "<%=path%>";
        appendContents();
        function appendContents() {
            $.ajax({
                type: "POST",
                url: path + "/queryChartList.json",
                data: {},
                beforeSend:function(xhr){

                },
                error: function () {
                    alert("出错了");
                },
                success: function (data) {
                    var list = data.records;
                    var title = data.title;
                    var totalCount = data.totalCount;
                    $.each(
                        list, function () {
                            var chart = iChart.create({
                                render:"ichart-render",
                                width:800,
                                height:400,
                                background_color:"#fefefe",
                                gradient:false,
                                color_factor:0.2,
                                border:{
                                    color:"BCBCBC",
                                    width:1
                                },
                                align:"center",
                                offsetx:0,
                                offsety:0,
                                sub_option:{
                                    mini_label_threshold_angle : 70,//迷你label的阀值,单位:角度
                                    mini_label:{//迷你label配置项
                                        fontsize:20,
                                        fontweight:600,
                                        color : '#ffffff'
                                    },
                                    border:{
                                        color:"#BCBCBC",
                                        width:1
                                    },
                                    label:{
                                        sign:false,//设置禁用label的小图标
                                        fontweight:600,
                                        padding:'0 4',
                                        fontsize:11,
                                        color:"#4572a7",
                                        border:{
                                            color:"#BCBCBC",
                                            enable:false
                                        },
                                        background_color:null
                                    },
                                    listeners:{
                                        parseText:function(d, t){
                                            return d.get('value')+"%";//自定义label文本
                                        }
                                    }
                                },
                                shadow:true,
                                shadow_color:"#666666",
                                shadow_blur:2,
                                showpercent:false,
                                column_width:"70%",
                                bar_height:"70%",
                                radius:"90%",
                                title:{
                                    text:title,
                                    color:"#111111",
                                    fontsize:20,
                                    font:"微软雅黑",
                                    textAlign:"center",
                                    height:30,
                                    offsetx:0,
                                    offsety:0
                                },
                                subtitle:{
                                    text:"子标题"+title,
                                    color:"#111111",
                                    fontsize:16,
                                    font:"微软雅黑",
                                    textAlign:"center",
                                    height:20,
                                    offsetx:0,
                                    offsety:0
                                },
                                footnote:{
                                    text:"脚标题"+title,
                                    color:"#111111",
                                    fontsize:12,
                                    font:"微软雅黑",
                                    textAlign:"right",
                                    height:20,
                                    offsetx:0,
                                    offsety:0
                                },
                                legend:{
                                    enable:true,
                                    background_color:"#fefefe",
                                    color:"#333333",
                                    fontsize:12,
                                    border:{
                                        color:"#BCBCBC",
                                        width:1
                                    },
                                    column:1,
                                    row:1,
                                    align:"right",
                                    valign:"center",
                                    offsetx:0,
                                    offsety:0
                                },
                                coordinate:{
                                    width:"80%",
                                    height:"84%",
                                    background_color:"#ffffff",
                                    axis:{
                                        color:"#a5acb8",
                                        width:[1,"",1,""]
                                    },
                                    grid_color:"#d9d9d9",
                                    label:{
                                        fontweight:500,
                                        color:"#666666",
                                        fontsize:11
                                    }
                                },
                                label:{
                                    fontweight:500,
                                    color:"#666666",
                                    fontsize:11
                                },
                                type:"pie2d",
                                data:list
                            });
                            chart.draw();
                        }
                    );
                },
                complete:function(xhr){
                    //隐藏div
                }
            });
        }

    </script>
</head>
<body style="background-color:#244c74;">
<div id="ichart-render"></div>
</body>
</html>

查询列表的接口

	/**
     * 查询表数据
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/queryChartList", method = {POST})
    @ResponseBody
    public JsonVOArray<ChartData> queryChartList(HttpServletRequest request) {
        LOGGER.info("welcome queryChartList!");
        JsonVOArray<ChartData> vo = new JsonVOArray<ChartData>();
        vo.setSuccess(false);
        List<ChartData> list = friendService.queryChartData();
        vo.setRecords(list);
        vo.setTitle("饼状图表标题样例");
        vo.setTotalCount(list.size());
        return vo;
    }

实体类

public class ChartData{
    String name;
    int value;
    String color;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
}

表的数据:

华为	18	#4572a7
小米	12	#aa4643
苹果	45	#89a54e
长春	10	#854123
订单	15	#dd4123
name value color

以下借用ichartjs官网的一个图作为参考。
这里写图片描述
3,eChart

ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。

ECharts 3 中更是加入了更多丰富的交互功能以及更多的可视化效果,并且对移动端做了深度的优化。

主要优势:丰富的图表类型、多个坐标系的支持、移动端的优化、深度的交互式数据探索、大数据量的展现、多维数据的支持以及丰富的视觉编码手段、动态数据、绚丽的特效。

以下是官方实例

app.title = '环形图';

option = {
    tooltip: {
        trigger: 'item',
        formatter: "{a} <br/>{b}: {c} ({d}%)"
    },
    legend: {
        orient: 'vertical',
        x: 'left',
        data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎']
    },
    series: [
        {
            name:'访问来源',
            type:'pie',
            radius: ['50%', '70%'],
            avoidLabelOverlap: false,
            label: {
                normal: {
                    show: false,
                    position: 'center'
                },
                emphasis: {
                    show: true,
                    textStyle: {
                        fontSize: '30',
                        fontWeight: 'bold'
                    }
                }
            },
            labelLine: {
                normal: {
                    show: false
                }
            },
            data:[
                {value:335, name:'直接访问'},
                {value:310, name:'邮件营销'},
                {value:234, name:'联盟广告'},
                {value:135, name:'视频广告'},
                {value:1548, name:'搜索引擎'}
            ]
        }
    ]
};

实际效果如下图:
这里写图片描述
具体可以到echart官网的图表编辑区在线修改看实际效果。

4,优劣比较

本文仅就环形图作讨论研究,其他图表类型暂不管。

  • highCharts可定制程度高,图表编辑区操作方便,环形图可以添加中心文字和图标,可以指定环形图每一块的颜色,也是我重点研究的。
  • ichartjs在线设计器功能比较简单,只能操作部分图表类型,环形图中心可以添加文字,但无法添加图标,可以指定环形图每一块的颜色
  • echart图表编辑区操作方便,目前看来无法为环形图中心添加文字和图标,api看起来比较难懂,无法指定每块颜色。

个人开发或者非商业用途的开发建议选择highCharts,其次选择eChart或者ichartjs

实现多重环形的方法可以使用Echarts中的Polar(极坐标)和Bar(柱状)来实现。在Echarts中,可以通过设置多个系列来创建多重环形。每个系列代表一个环,通过设置各个环的半径、角度和颜色等属性,可以实现多重环形的效果。 首先,需要引入Echarts库,然后创建一个容器来承载图表。接着,通过配置项来设置图表的样式和数据,其中包括设置多个系列的属性。例如,设置各个环的半径、角度、颜色和数据等。 下面是一个示例代码,展示了如何使用Echarts实现多重环形: ```javascript // 引入Echarts库 import echarts from 'echarts'; // 创建容器 const chartContainer = document.getElementById('chart-container'); // 初始化图表 const chart = echarts.init(chartContainer); // 配置项 const option = { // 设置图表类型为极坐标 polar: {}, // 设置多个系列,每个系列代表一个环 series: [ { type: 'bar', data: [/* 数据 */], // 设置第一个环的半径和角度 radius: ['0%', '30%'], angle: [0, 360], // 设置第一个环的颜色和样式 itemStyle: { color: 'blue', }, }, { type: 'bar', data: [/* 数据 */], // 设置第二个环的半径和角度 radius: ['30%', '60%'], angle: [0, 360], // 设置第二个环的颜色和样式 itemStyle: { color: 'green', }, }, // 可以继续添加更多的系列 ], }; // 使用配置项生成图表 chart.setOption(option); ``` 使用上述代码,你可以根据自己的需求设置每个环的半径、角度、颜色和数据等属性,从而实现多重环形
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值