[echarts] - When I know Echarts 当我结识Echarts图表

初见:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!-- 引入 ECharts 文件 -->
    <script src="echarts.min.js"></script>
</head>
</html>

echarts给我们封装好了这个js

容器:

<body>
    <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
</body>

使用这样的id去放置它

连接:

<script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>

echarts.init(容器id实例),返回myChart对象

声明一个配置option,里面包含了上下左右的数据,最后

将myChart对象中setOption(传入声明的option)

下载:

https://echarts.baidu.com/download.html

github:

https://github.com/apache/incubator-echarts

南丁格尔:

个性化图表

颜色设置:

var chart = echarts.init(dom, 'light');
或者
var chart = echarts.init(dom, 'dark');

更多: 主题编辑器 编辑属于自己的echarts主体

https://echarts.baidu.com/theme-builder/

// 假设主题名称是 "vintage"
$.getJSON('xxx/xxx/vintage.json', function (themeJSON) {
    echarts.registerTheme('vintage', JSON.parse(themeJSON))
    var chart = echarts.init(dom, 'vintage');
});

如果只想功能强些:异步加载

入门示例中的数据是在初始化后setOption中直接填入的,但是很多时候可能数据需要异步加载后再填入。ECharts 中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要通过 jQuery 等工具异步获取数据后通过 setOption 填入数据和配置项就行。

var myChart = echarts.init(document.getElementById('main'));

$.get('data.json').done(function (data) {
    myChart.setOption({
        title: {
            text: '异步数据加载示例'
        },
        tooltip: {},
        legend: {
            data:['销量']
        },
        xAxis: {
            data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
        },
        yAxis: {},
        series: [{
            name: '销量',
            type: 'bar',
            data: [5, 20, 36, 10, 10, 20]
        }]
    });
});

或者先设置完其它的样式,显示一个空的直角坐标轴,然后获取数据后填入数据。(空架子,之后数据通过异步ajax,json获取)

var myChart = echarts.init(document.getElementById('main'));
// 显示标题,图例和空的坐标轴 (空架子)
myChart.setOption({
    title: {
        text: '异步数据加载示例'
    },
    tooltip: {},
    legend: {
        data:['销量']
    },
    xAxis: {
        data: []
    },
    yAxis: {},
    series: [{
        name: '销量',
        type: 'bar',
        data: []
    }]
});

// 异步加载数据 (获取数据,通过ajax:success:function(data)亦可)
$.get('data.json').done(function (data) {
    // 填入数据
    myChart.setOption({
        xAxis: {
            data: data.categories
        },
        series: [{
            // 根据名字对应到相应的系列
            name: '销量',
            data: data.data
        }]
    });
});

loading:

myChart.showLoading();  展示loading转圆圈表示正在加载数据
$.get('data.json').done(function (data) {
    myChart.hideLoading(); 数据data加载后隐藏loading
    myChart.setOption(...); 设置myChart.setOption(the option)
});

Dynamic  Echarts:

//模拟时间数据
var
base = +new Date(2014, 9, 3); var oneDay = 24 * 3600 * 1000; var date = []; var data = [Math.random() * 150]; var now = new Date(base);
//添加数据并排除左侧旧数据
function addData(shift) { now = [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'); date.push(now); data.push((Math.random() - 0.4) * 10 + data[data.length - 1]); if (shift) { date.shift(); data.shift(); } now = new Date(+new Date(now) + oneDay); } //循环添加数据 for (var i = 1; i < 100; i++) { addData(); } option = { xAxis: { type: 'category', boundaryGap: false, data: date }, yAxis: { boundaryGap: [0, '50%'], type: 'value' }, series: [ { name:'成交', type:'line', // smooth:true, symbol: 'none', stack: 'a', areaStyle: { normal: {} }, data: data } ] }; //设置时间间隔,并添加数据和设置新数据 setInterval(function () { addData(true); myChart.setOption({ xAxis: { data: date }, series: [{ name:'成交', data: data }] }); }, 500);

dataset:

如果想展示不止一条曲线和不同时间的价格走向,也许应该:ECharts 4 以前,数据只能声明在各个“系列(series)”中.

ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射。这在不少场景下能带来使用上的方便。

option = {
    legend: {},
    tooltip: {},
    dataset: {
        // 提供一份数据。
        source: [
            ['product', '2015', '2016', '2017'],
            ['Matcha Latte', 43.3, 85.8, 93.7],
            ['Milk Tea', 83.1, 73.4, 55.1],
            ['Cheese Cocoa', 86.4, 65.2, 82.5],
            ['Walnut Brownie', 72.4, 53.9, 39.1]
        ]
    },
    // 声明一个 X 轴,类目轴(category)。默认情况下,类目轴对应到 dataset 第一列。
    xAxis: {type: 'category'},
    // 声明一个 Y 轴,数值轴。
    yAxis: {},
    // 声明多个 bar 系列,默认情况下,每个系列会自动对应到 dataset 的每一列。
    series: [
        {type: 'bar'},
        {type: 'bar'},
        {type: 'bar'}
    ]
}

多曲线展示:

展示方式:

比如想查看C公司2015-2018年的某产品价格走向,

 对应的数据:

 

看上面获取数据的方式,也就是2015的价格走向,这个数组中的数据是A,B,C公司按序来的.

同样2016,2017,2018年价格是一样的.

dimension:

var option1 = {
    dataset: {
        dimensions: [
            {name: 'score'},
            // 可以简写为 string,表示维度名。
            'amount',
            // 可以在 type 中指定维度类型。
            {name: 'product', type: 'ordinal'}
        ],
        source: [...]
    },
    ...
};

var option2 = {
    dataset: {
        source: [...]
    },
    series: {
        type: 'line',
        // 在系列中设置的 dimensions 会更优先采纳。
        dimensions: [
            null, // 可以设置为 null 表示不想设置维度名
            'amount',
            {name: 'product', type: 'ordinal'}
        ]
    },
    ...
};
var option = {
    dataset: {
        source: [
            ['score', 'amount', 'product'],
            [89.3, 58212, 'Matcha Latte'],
            [57.1, 78254, 'Milk Tea'],
            [74.4, 41032, 'Cheese Cocoa'],
            [50.1, 12755, 'Cheese Brownie'],
            [89.7, 20145, 'Matcha Cocoa'],
            [68.1, 79146, 'Tea'],
            [19.6, 91852, 'Orange Juice'],
            [10.6, 101852, 'Lemon Juice'],
            [32.7, 20112, 'Walnut Brownie']
        ]
    },
    grid: {containLabel: true},
    xAxis: {},
    yAxis: {type: 'category'},
    series: 
       
    [
        {
            type: 'bar',
             dimensions: [
            {name: 'score'},
            // 可以简写为 string,表示维度名。
            'amount',
            // 可以在 type 中指定维度类型。
            {name: 'product', type: 'ordinal'}
        ],
            encode: {
                // Map the "amount" column to X axis.
                x: 'amount',
                // Map the "product" column to Y axis
                y: 'product'
            }
        }
    ]
    
};

维度,说白了就是要让展示的数据在哪个轴上进行展示,当上面dimensions中的{name:'score'}改为'amount'后,x轴(横轴)将显示score的数值.

其中声明的dimensions的数组中分别为: 维度0,维度1,维度2... 可以指定维度的名字->{name:'dimen0'},{name:'dimen1'}, 也可以直接字符串声明...{name:'dimen1'},'dimen2' <<

encode:

var option = {
    dataset: {
        source: [
            ['score', 'amount', 'product'],
            [89.3, 58212, 'Matcha Latte'],
            [57.1, 78254, 'Milk Tea'],
            [74.4, 41032, 'Cheese Cocoa'],
            [50.1, 12755, 'Cheese Brownie'],
            [89.7, 20145, 'Matcha Cocoa'],
            [68.1, 79146, 'Tea'],
            [19.6, 91852, 'Orange Juice'],
            [10.6, 101852, 'Lemon Juice'],
            [32.7, 20112, 'Walnut Brownie']
        ]
    },
    grid: {containLabel: true},
    xAxis: {},
    yAxis: {type: 'category'},
    series: [
        {
            type: 'bar',
            encode: {
                // Map the "amount" column to X axis.
                x: 'amount',
                // Map the "product" column to Y axis
                y: 'product'
            }
        }
    ]
};

有了维度的概念,接下来就是映射了,就是说我把哪个维度的数据映射到哪个地方,(哪个图表,柱状图或曲线图中)

encode 声明的基本结构如下,其中冒号左边是坐标系、标签等特定名称,如 'x''y''tooltip' 等,冒号右边是数据中的维度名(string 格式)或者维度的序号(number 格式,从 0 开始计数),可以指定一个或多个维度(使用数组)。通常情况下,下面各种信息不需要所有的都写,按需写即可。

下面是 encode 支持的属性:

// 在任何坐标系和系列中,都支持:
encode: {
    // 使用 “名为 product 的维度” 和 “名为 score 的维度” 的值在 tooltip 中显示
    tooltip: ['product', 'score']
    // 使用 “维度 1” 和 “维度 3” 的维度名连起来作为系列名。(有时候名字比较长,这可以避免在 series.name 重复输入这些名字)
    seriesName: [1, 3],
    // 表示使用 “维度2” 中的值作为 id。这在使用 setOption 动态更新数据时有用处,可以使新老数据用 id 对应起来,从而能够产生合适的数据更新动画。
    itemId: 2,
    // 指定数据项的名称使用 “维度3” 在饼图等图表中有用,可以使这个名字显示在图例(legend)中。
    itemName: 3
}

// 直角坐标系(grid/cartesian)特有的属性:
encode: {
    // 把 “维度1”、“维度5”、“名为 score 的维度” 映射到 X 轴:
    x: [1, 5, 'score'],
    // 把“维度0”映射到 Y 轴。
    y: 0
}

// 极坐标系(polar)特有的属性:
encode: {
    radius: 3,
    angle: 2
}

// 地理坐标系(geo)特有的属性:
encode: {
    lng: 3,
    lat: 2
}

// 对于一些没有坐标系的图表,例如饼图、漏斗图等,可以是:
encode: {
    value: 3
}

这里详细看下维度和映射的配合使用:

[小插曲]:https://www.echartsjs.com/gallery/editor.html?c=dataset-encode1

将这里的line:55改为line形式后居然可以看到一座城市.其实该图表也是用来表述各个城市国家一些数值的:

正题:

上表鼠标放上点击数值时可以有一个阴影 tip 提示了两种数据:

  dataset: {
            dimensions: [   //维度 (共5项)
                'Income',
                'Life Expectancy',
                'Population',
                'Country',
                {name: 'Year', type: 'ordinal'}
            ],
            source: data
        },
        series: [
            {
                type: 'scatter',
                symbolSize: symbolSize,
                xAxisIndex: 0,
                yAxisIndex: 0,
                encode: {
                    x: 'Income',
                    y: 'Life Expectancy',
                    tooltip: [0,1  ]  //<<<与此处设置有关 只让tip弹出维度0'Income'和维度1'Life Expectancy'
                }
            },
            {
                type: 'scatter',
                symbolSize: symbolSize,
                xAxisIndex: 1,
                yAxisIndex: 1,
                encode: {
                    x: 'Country',
                    y: 'Income',
                    tooltip: [3, 4]  //<<<同样这里也是指示了另一个图表中tip中展示的为维度3和维度4的数值
                }
            },

维度3和维度4

 继续测试其它声明作用:

 1 yAxis: [
 2             {type: 'value', gridIndex: 0, name: 'Year'},
 3             {type: 'value', gridIndex: 1, name: 'Income'},
 4             {type: 'value', gridIndex: 2, name: 'Population'},
 5             {type: 'value', gridIndex: 3, name: 'Population'}
 6         ],
 7         dataset: {
 8             dimensions: [
 9                 'Income',
10                 'Life Expectancy',
11                 'Population',
12                 'Country',
13                 {name: 'Year', type: 'ordinal'}
14             ],
15             source: data
16         },
17         series: [
18             {
19                 type: 'scatter',
20                 symbolSize: symbolSize,
21                 xAxisIndex: 0,
22                 yAxisIndex: 0,
23                 encode: {
24                     x: ['Income'],
25                     y: 4,
26                     seriesName: [0, 1],
27                     itemId: 2,
28                     itemName: 3,
29                     tooltip: [0,1  ]
30                 }
31             },

可以看到Y轴改为了Year,而tip的标题是因为encode中seriesName: [0, 1],(拼合标题名为维度0+维度1)的作用,而标题下面的Germany国家名是因为itemName: 3,(显示item名为维度3)的作用.

visualMap:

根据色值显示数据增量.

var option = {
    dataset: {
        source: [
            ['score', 'amount', 'product'],
            [89.3, 58212, 'Matcha Latte'],
            [57.1, 78254, 'Milk Tea'],
            [74.4, 41032, 'Cheese Cocoa'],
            [50.1, 12755, 'Cheese Brownie'],
            [89.7, 20145, 'Matcha Cocoa'],
            [68.1, 79146, 'Tea'],
            [19.6, 91852, 'Orange Juice'],
            [10.6, 101852, 'Lemon Juice'],
            [32.7, 20112, 'Walnut Brownie']
        ]
    },
    grid: {containLabel: true},
    xAxis: {name: 'amount'},
    yAxis: {type: 'category'},
    visualMap: {    //<<<视觉通道 
        orient: 'horizontal',
        left: 'center', 
        min: 10, //最小值  var min = Math.min.apply(null, arr); 快速理解js中的apply
        max: 100, //最大值 (此处应该设定为某个数据数组的max)  var max = Math.max.apply(null, arr);
        text: ['High Score', 'Low Score'], //显示字母文字
        // Map the score column to color
        dimension: 0, //要根据哪个维度去做色值展示
        inRange: {  //色值a->b渐变
            color: ['#D7DA8B', '#E15457']
        }
    },
    series: [
        {
            type: 'bar',
            encode: {
                // Map the "amount" column to X axis.
                x: 'amount',
                // Map the "product" column to Y axis
                y: 'product'
            }
        }
    ]
};

色值(视觉)通道最主要的应用:

默认映射与指定映射:

var option = {
    legend: {},
    tooltip: {},
    dataset: {
        source: [
            ['product', '2012', '2013', '2014', '2015', '2016', '2017'],
            ['Matcha Latte', 41.1, 30.4, 65.1, 53.3, 83.8, 98.7],
            ['Milk Tea', 86.5, 92.1, 85.7, 83.1, 73.4, 55.1],
            ['Cheese Cocoa', 24.1, 67.2, 79.5, 86.4, 65.2, 82.5],
            ['Walnut Brownie', 55.2, 67.1, 69.2, 72.4, 53.9, 39.1]
        ]
    },
    series: [{
        type: 'pie',
        radius: 90,
        center: ['25%', '30%']  //位置
        // No encode specified, by default, it is '2012'.  没有自定义映射,使用默认,取第一列的2012数值
    }, {
        type: 'pie',
        radius: 60,
        center: ['75%', '30%'],
        encode: {         //自定义映射,显示item名字为product列,value取2013列
            itemName: 'product',
            value: '2013'
        }
    }, {
        type: 'pie',
        radius: 60,
        center: ['25%', '75%'],
        encode: {
            itemName: 'product',
            value: '2014'
        }
    }, {
        type: 'pie',
        radius: 60,
        center: ['75%', '75%'],
        encode: {
            itemName: 'product',
            value: '2015'
        }
    }]
};

圆点展示:

var option = {
    dataset: {
        source: [
            ['score', 'amount', 'product'],
            [89.3, 58212, 'Matcha Latte'],
            [57.1, 78254, 'Milk Tea'],
            [74.4, 41032, 'Cheese Cocoa'],
            [50.1, 12755, 'Cheese Brownie'],
            [89.7, 20145, 'Matcha Cocoa'],
            [68.1, 79146, 'Tea'],
            [19.6, 91852, 'Orange Juice'],
            [10.6, 101852, 'Lemon Juice'],
            [32.7, 20112, 'Walnut Brownie']
        ]
    },
    grid: {containLabel: true},
    xAxis: {name: 'amount'},
    yAxis: {type: 'category'},
    visualMap: {
        orient: 'horizontal',
        left: 'center',
        min: 10,
        max: 150000,
        text: ['High Score', 'Low Score'],
        // Map the score column to color
        dimension: 1,
        inRange: {
            symbolSize: [10, 150],
            color: ['#D7DA8B', '#E15457']
        }
    },
    series: [
        {
            type: 'scatter',
            encode: {
                // Map the "amount" column to X axis.
                itemName: 1,
                x: 'amount',
                // Map the "product" column to Y axis
                y: 'product'
            }
        }
    ]
};

更深入的改天学习吧

除了二维数组以外,dataset 也支持例如下面 key-value 方式的数据格式,这类格式也非常常见。但是这类格式中,目前并不支持 seriesLayoutBy 参数。

dataset: [{
    // 按行的 key-value 形式(对象数组),这是个比较常见的格式。
    source: [
        {product: 'Matcha Latte', count: 823, score: 95.8},
        {product: 'Milk Tea', count: 235, score: 81.4},
        {product: 'Cheese Cocoa', count: 1042, score: 91.2},
        {product: 'Walnut Brownie', count: 988, score: 76.9}
    ]
}, {
    // 按列的 key-value 形式。
    source: {
        'product': ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'],
        'count': [823, 235, 1042, 988],
        'score': [95.8, 81.4, 91.2, 76.9]
    }
}]

ECharts 3 的数据设置方式(series.data)仍正常使用

ECharts 4 之前一直以来的数据声明方式仍然被正常支持,如果系列已经声明了 series.data, 那么就会使用 series.data 而非 dataset

{
    xAxis: {
        type: 'category'
        data: ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie']
    },
    yAxis: {},
    series: [{
        type: 'bar',
        name: '2015',
        data: [89.3, 92.1, 94.4, 85.4]
    }, {
        type: 'bar',
        name: '2016',
        data: [95.8, 89.4, 91.2, 76.9]
    }, {
        type: 'bar',
        name: '2017',
        data: [97.7, 83.1, 92.5, 78.1]
    }]
}

其实,series.data 也是种会一直存在的重要设置方式。一些特殊的非 table 格式的图表,如 treemapgraphlines 等,现在仍不支持在 dataset 中设置,仍然需要使用 series.data。另外,对于巨大数据量的渲染(如百万以上的数据量),需要使用 appendData 进行增量加载,这种情况不支持使用 dataset

多个 dataset 和他们的引用

可以同时定义多个 dataset。系列可以通过 series.datasetIndex 来指定引用哪个 dataset。例如:

var option = {
    dataset: [{
        // 序号为 0 的 dataset。
        source: [...],
    }, {
        // 序号为 1 的 dataset。
        source: [...]
    }, {
        // 序号为 2 的 dataset。
        source: [...]
    }],
    series: [{
        // 使用序号为 2 的 dataset。
        datasetIndex: 2
    }, {
        // 使用序号为 1 的 dataset。
        datasetIndex: 1
    }]
}

目前并非所有图表都支持 dataset。支持 dataset 的图表有: linebarpiescattereffectScatterparallelcandlestickmapfunnelcustom。 后续会有更多的图表进行支持。

综合示例:

https://www.echartsjs.com/gallery/editor.html?c=dataset-link

GO ON

猜你喜欢

转载自www.cnblogs.com/ukzq/p/10297237.html