https://echarts.apache.org/examples/zh/editor.html?c=custom-profile
图表选择

技术点

  1. 显示图例的方法,使用空的条形图来显示图例
  2. 在series里面配置了条形图并配置name后,echart会自动根据 name的值去 legend的配置中匹配对应的图例名字并显示。

image.png

options

series中的 custom,data字段

  1. data: [
  2. {
  3. itemStyle: { normal: { color: color[0] } },
  4. name: '正常',
  5. value: [0, 0, 10],
  6. }
  7. ]
  • itemStyle: 所渲染的矩形的样式
  • name: 该矩形的状态名
  • value: 第0项代表 yAxis类别标识,
    • 例如0就代表 ECS的,1就是 RDS的;
    • 第1和第2项代表该矩形区域对应的x坐标范围开始于0,结束于1

options配置

  1. /**
  2. * Description: 用条形图的不同颜色,来表示不同时间区间段的状态
  3. * y轴用于展示各网口
  4. * x轴用于展示时间(分钟)
  5. * 以 ECS为例
  6. * 图中则表示了0~10分钟为正常,10~25分钟为繁忙,25~45分钟为故障,45~60分钟为离线
  7. */
  8. import * as echarts from 'echarts/core';
  9. // 各状态的颜色
  10. const color = ['#2f4554', '#61a0a8', '#d48265', '#c23531'];
  11. // 四种状态
  12. const state = ['正常', '繁忙', '故障', '离线'];
  13. // import { getColor } from '@/components';
  14. export function getOption({data, xData, length, theme}) {
  15. return {
  16. color,
  17. grid: {
  18. top: length === 1 ? 24 : 40,
  19. left: 24,
  20. right: 40,
  21. bottom: 32,
  22. containLabel: true,
  23. },
  24. xAxis: {
  25. name: '时间',
  26. min: 0, // x轴零刻度对应的实际值
  27. },
  28. yAxis: {
  29. name: '设备',
  30. data: ['ECS', 'RDS'],
  31. },
  32. series: [
  33. // 用空bar来显示四个图例
  34. { name: state[0], type: 'bar', data: [] },
  35. { name: state[1], type: 'bar', data: [] },
  36. { name: state[2], type: 'bar', data: [] },
  37. { name: state[3], type: 'bar', data: [] },
  38. {
  39. type: 'custom',
  40. renderItem: function (params, api) {
  41. const categoryIndex = api.value(0)
  42. const start = api.coord([api.value(1), categoryIndex])
  43. const end = api.coord([api.value(2), categoryIndex])
  44. const height = 24
  45. return {
  46. type: 'rect',
  47. shape: echarts.graphic.clipRectByRect(
  48. {
  49. x: start[0],
  50. y: start[1] - height / 2,
  51. width: end[0] - start[0],
  52. height: height,
  53. },
  54. {
  55. x: params.coordSys.x,
  56. y: params.coordSys.y,
  57. width: params.coordSys.width,
  58. height: params.coordSys.height,
  59. }
  60. ),
  61. style: api.style(),
  62. }
  63. },
  64. encode: {
  65. x: [1, 2],
  66. y: 0,
  67. },
  68. data: [
  69. {
  70. itemStyle: { normal: { color: color[0] } },
  71. name: '正常',
  72. value: [0, 0, 10],
  73. },
  74. {
  75. itemStyle: { normal: { color: color[1] } },
  76. name: '繁忙',
  77. value: [0, 10, 25],
  78. },
  79. {
  80. itemStyle: { normal: { color: color[2] } },
  81. name: '故障',
  82. value: [0, 25, 45],
  83. },
  84. {
  85. itemStyle: { normal: { color: color[3] } },
  86. name: '离线',
  87. value: [0, 45, 60],
  88. },
  89. // 第二个数据 1 代表第二个数据
  90. {
  91. itemStyle: { normal: { color: color[0] } },
  92. name: '正常',
  93. value: [1, 0, 20],
  94. },
  95. // {
  96. // itemStyle: { normal: { color: color[1] } },
  97. // name: '繁忙',
  98. // value: [1, 15, 20],
  99. // },
  100. {
  101. itemStyle: { normal: { color: color[2] } },
  102. name: '故障',
  103. value: [1, 20, 35],
  104. },
  105. // {
  106. // itemStyle: { normal: { color: color[3] } },
  107. // name: '离线',
  108. // value: [1, 35, 40],
  109. // },
  110. {
  111. itemStyle: { normal: { color: color[0] } },
  112. name: '正常',
  113. value: [1, 35, 60],
  114. },
  115. // {
  116. // itemStyle: { normal: { color: color[3] } },
  117. // name: '离线',
  118. // value: [1, 45, 60],
  119. // },
  120. ],
  121. },
  122. ],
  123. tooltip: {
  124. formatter: (params) => {
  125. const { name, value} = params;
  126. return `${name}: ${value[1]} ~ ${value[2]}`;
  127. },
  128. },
  129. legend: {
  130. data: state,
  131. bottom: 8,
  132. selectedMode: false, // 图例设为不可点击
  133. textStyle: {
  134. color: theme === 'dark' ? '#fff' : '#333',
  135. },
  136. },
  137. };
  138. }