JavaScript自定义图表

利用大屏的自定义图表控件,编写JavaScript绘制自定义图表的过程与报告相同,这里给一个echarts 3D地图的案例:

将经纬度数据、想要展示的度量值,和地理坐标对应的城市名称维度拖入数据面板,然后利用外部请求获取地理位置信息,加上刚刚引入的数据,通过echarts gl绘制如下3D地图:

  1. var barDataSet = dataSet.map(function (dataItem) {
  2. return [dataItem[0], dataItem[1], Math.sqrt(dataItem[2])];
  3. });
  4. var maxValue = Math.max(...barDataSet.map(d => d[2]));
  5. window.top.fetch('https://ydcdn.nosdn.127.net/echarts/assets/map/json/china.json').then(e => e.json()).then(chinaJson => {
  6. echarts.registerMap('china', chinaJson);
  7. myChart.setOption({
  8. backgroundColor: 'transparent',
  9. geo3D: {
  10. map: 'china',
  11. shading: 'lambert',
  12. label: {
  13. show: true,
  14. textStyle: {
  15. color: '#fff', //地图初始化区域字体颜色
  16. fontSize: 12,
  17. opacity: 1,
  18. backgroundColor: 'rgba(0,0,0,0)'
  19. },
  20. },
  21. light: {
  22. main: {
  23. intensity: 3,
  24. shadow: true,
  25. shadowQuality: 'high',
  26. alpha: 30
  27. },
  28. ambient: {
  29. intensity: 0.3
  30. },
  31. },
  32. viewControl: {
  33. distance: 80,
  34. center: [0, -10, 0],
  35. panMouseButton: 'left',
  36. rotateMouseButton: 'right'
  37. },
  38. groundPlane: {
  39. show: false,
  40. color: '#999'
  41. },
  42. postEffect: {
  43. enable: true,
  44. bloom: {
  45. enable: false
  46. },
  47. SSAO: {
  48. radius: 1,
  49. intensity: 1,
  50. enable: true
  51. },
  52. depthOfField: {
  53. enable: false,
  54. focalRange: 10,
  55. blurRadius: 10,
  56. fstop: 1
  57. }
  58. },
  59. temporalSuperSampling: {
  60. enable: true
  61. },
  62. itemStyle: {
  63. color: '#222535',
  64. borderWidth: 1,
  65. borderColor: '#4B516D',
  66. },
  67. regionHeight: 2
  68. },
  69. visualMap: {
  70. max: maxValue,
  71. calculable: true,
  72. realtime: false,
  73. inRange: {
  74. color: ['#0B1F4C', '#303369', '#3D429A', '#A02B3B', '#C8352C', '#D04E32', '#D76638', '#E0823F', '#E89D46', '#EDAD49', '#F6C750']
  75. },
  76. outOfRange: {
  77. colorAlpha: 0
  78. }
  79. },
  80. series: [{
  81. type: 'bar3D',
  82. coordinateSystem: 'geo3D',
  83. shading: 'lambert',
  84. data: barDataSet,
  85. barSize: 0.5,
  86. minHeight: 0.2,
  87. silent: false,
  88. itemStyle: {
  89. color: 'orange'
  90. },
  91. emphasis: {
  92. label: {
  93. show: true,
  94. formatter: p => dataSet[p.dataIndex][3] + ': ' + p.data[2]
  95. }
  96. }
  97. }]
  98. });
  99. })

绘制完成的3D地图如下:

map4.png

echarts图表控件不只能绘制echarts图表,实际上它有无尽的可能,你可以在里面绘制一个自己的表格,也可以引入外部插件,如d3,antv等可视化框架,完成你想要绘制的任何酷炫图表。下面以antv L7地理空间数据可视化框架为例,绘制一张3D柱状地图

  1. const script = document.createElement('script');
  2. script.type = 'text/javascript';
  3. script.src = 'https://unpkg.com/@antv/l7'; // 引入antv L7框架
  4. document.getElementsByTagName('head')[0].appendChild(script);
  5. script.onload = function () {
  6. const map = document.querySelector('#main');
  7. map.style = 'position:absolute;top:0;bottom:0;width:100%;'
  8. emitter.emit('renderDone');
  9. const scene = new L7.Scene({
  10. id: 'main',
  11. map: new L7.GaodeMap({
  12. pitch: 35.210526315789465,
  13. style: 'dark',
  14. center: [ 104.288144, 31.239692 ],
  15. zoom: 4.4
  16. })
  17. });
  18. scene.on('loaded', () => emitter.emit('renderDone')); // 图表加载完成后手动触发图表renderDone
  19. fetch('https://gw.alipayobjects.com/os/rmsportal/oVTMqfzuuRFKiDwhPSFL.json')
  20. .then(res => res.json())
  21. .then(data => {
  22. const pointLayer = new L7.PointLayer({})
  23. .source(data.list, {
  24. parser: {
  25. type: 'json',
  26. x: 'j',
  27. y: 'w'
  28. }
  29. })
  30. .shape('cylinder')
  31. .size('t', function(level) {
  32. return [ 1, 2, level * 2 + 20 ];
  33. })
  34. .active(true)
  35. .color('t', [
  36. '#094D4A',
  37. '#146968',
  38. '#1D7F7E',
  39. '#289899',
  40. '#34B6B7',
  41. '#4AC5AF',
  42. '#5FD3A6',
  43. '#7BE39E',
  44. '#A1EDB8',
  45. '#CEF8D6'
  46. ])
  47. .style({
  48. opacity: 1.0
  49. });
  50. scene.addLayer(pointLayer);
  51. });
  52. }
  53. emitter.on('resize', () => {
  54. // 在这里处理报表resize事件
  55. });

绘制完成的3D地图如下: map5.gif

需要注意的点是绘制非echarts时,需要手动在代码中监听图表的renderDone事件,保证有数能知道该自定义报表何时绘制完成,否则会影响该报表的导出截图、定时邮件功能;另外如果需要监听报表resize事件,可在代码中监听resize事件自行处理,以上2个事件在上述例子中均有代码实现说明。