SVG可视化简易漏斗图

简介: Visualization as a problem-solving and knowledge discovery tool has become even more important as we enter the Big Data era.

Visualization as a problem-solving and knowledge discovery tool has become even more important as we enter the Big Data era.

效果图

result

js代码

jQuery

/*------------------------------------------
    说明:漏斗图 - TEST
    作者:taolinran
    日期:2016-12
---------------------------------------------*/

/* global app: true */

(function(root){
  var app = (function() {
      var funnelDefaultColor = [
            '#e15025',
            '#f18922',
            '#f7a83a',
            '#45bf7b',
            '#5f86d1',
            '#4774ca',
            '#3d5f9f'
        ];

      return {
        /*-------------------------------------------
          Func: 生成漏斗图
          params: [{}]
          memo: 还需要加一个是否支持SVG的判断
        ---------------------------------------------*/
        genFunelChart: function(data, height, w1, w2, funelColors) {

            var defaultColor = '#eee',
                defaultData = [
                    {percent: 0.143},
                    {percent: 0.143},
                    {percent: 0.143},
                    {percent: 0.143},
                    {percent: 0.143},
                    {percent: 0.143},
                    {percent: 0.143}
                ],
                funelOpacity = 0.2;

            height = (typeof height !== 'undefined') ? height : 280;
            w1 = (typeof w1 !== 'undefined') ? w1 : 300;
            w2 = (typeof w2 !== 'undefined') ? w2 : 60;

            funelColors = (typeof funelColors !== 'undefined') ? funelColors : funnelDefaultColor;

            var allWidth = w1;

            var funelSvg = ['<svg id="funel_svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="' + allWidth + '" height="' + height + '" viewBox="0 0 ' + allWidth + ' ' + height + '">'];

            if (data[0]) {

                /* 边界处理之 全部为0 */
                $.each(data, function(i, item){
                    if (item.percent > 0) {
                        funelOpacity = 1;
                    }
                });

                if (funelOpacity !== 1) {
                    data = defaultData;
                }

                var p0 = 0;
                $.each(data, function(i, item){
                    /* 正常漏斗组成 */
                    var p1 = item.percent,
                        r0 = parseFloat((((w1 - w2) * p0) / 2).toFixed(3)),
                        r1 = parseFloat((((w1 - w2) * p1) / 2).toFixed(3)),

                        x1 = r0,
                        y1 = parseFloat((height * p0).toFixed(3)),

                        x2 = r0 + r1,
                        y2 = parseFloat((height * (p0 + p1)).toFixed(3)),

                        x3 = w1 - r0 - r1,
                        y3 = y2,

                        x4 = w1 - r0,
                        y4 = y1;


                    var colorNow = funelColors[i] || defaultColor,
                        normalPath = '<path d="M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y3 + ' L' + x4 + ' ' + y4 + ' Z"' +
                                    ' fill="' + colorNow + '" stroke="none" style="opacity: ' + funelOpacity + '"></path>';
                        funelSvg.push(normalPath);

                    p0 += p1;
                });
            }

            funelSvg.push('</svg>');

            return funelSvg.join('');

        },

        /*-------------------------------------------
          Func: 漏斗图svg
        ---------------------------------------------*/
        drawFunnelBySvg: function(elementId, data) {

            /* 参数暂时略 */
            var svgHtml = app.genFunelChart(data);

            $(elementId).html(svgHtml);
        },

      };
  })();

  root.app = app;

})(window);

$(document).ready(function() {
  var demoData = [
    {percent: 0.1},
    {percent: 0.3},
    {percent: 0.1},
    {percent: 0.25},
    {percent: 0.15},
    {percent: 0.05},
    {percent: 0.05}
  ];

  app.drawFunnelBySvg('#svg_panel', demoData);
});

草图

sketch

区块图(微调)

区块图

目录
相关文章
|
4月前
|
数据可视化
R语言多图合成:优雅地在一个画布上展示多个图形
【8月更文挑战第30天】R语言提供了多种方法来实现多图合成,从基础的`par()`函数到高级的`gridExtra`、`ggplot2`和`cowplot`包,每种方法都有其独特的优势和应用场景。通过掌握这些技术,你可以根据实际需求灵活地组合图形,从而更高效地展示和解读数据。希望本文能为你提供一些有益的参考和启示。
|
7月前
|
自然语言处理 数据可视化
【词云图绘制实战】——数据准备、清洗、多形式展示
【词云图绘制实战】——数据准备、清洗、多形式展示
|
7月前
|
数据可视化
实现绘制Sankey桑基图(河流图、分流图)流程数据可视化
实现绘制Sankey桑基图(河流图、分流图)流程数据可视化
|
7月前
|
编解码 数据可视化
R语言动态可视化:绘制历史全球平均温度的累积动态折线图动画gif视频图
R语言动态可视化:绘制历史全球平均温度的累积动态折线图动画gif视频图
|
7月前
|
存储 数据可视化 关系型数据库
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
绘制圆环图/雷达图/星形图/极坐标图/径向图POLAR CHART可视化分析汽车性能数据
|
7月前
|
数据可视化
R语言动态图可视化:如何、创建具有精美动画的图
R语言动态图可视化:如何、创建具有精美动画的图
|
7月前
eCharts实现漏斗图
eCharts实现漏斗图
213 0
eCharts实现漏斗图
|
7月前
|
数据可视化
Echarts5.3.2可视化案例-时间轴动态柱形图
Echarts5.3.2可视化案例-时间轴动态柱形图
|
7月前
|
数据可视化
Tableau可视化设计案例-03基本表、树形图、气泡图、词云
Tableau可视化设计案例-03基本表、树形图、气泡图、词云
|
7月前
|
数据可视化 定位技术 数据格式
Tableau可视化设计案例-07 多边形地图和背景图地图
Tableau可视化设计案例-07 多边形地图和背景图地图