对比漏斗图.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // 配置版本号
  2. const version = '2023071001'
  3. // 分类
  4. const category = 'Funnel'
  5. // 标题
  6. const title = '对比漏斗图'
  7. // 类别, new Line()
  8. const chartType = 'Funnel'
  9. // 用于标识,唯一,title的中文转拼音
  10. const name = 'DuiBiLouDouTu'
  11. // 右侧配置项
  12. const setting = [
  13. {
  14. label: '维度',
  15. // 设置组件类型, select / input / colorPicker
  16. type: 'select',
  17. // 字段
  18. field: 'xField',
  19. optionField: 'xField', // 对应options中的字段
  20. // 是否多选
  21. multiple: false,
  22. // 绑定的值
  23. value: '',
  24. // tab页。 data: 数据, custom: 自定义
  25. tabName: 'data'
  26. },
  27. {
  28. label: '指标',
  29. // 设置组件类型
  30. type: 'select',
  31. // 字段
  32. field: 'yField',
  33. // 对应options中的字段
  34. optionField: 'yField',
  35. // 是否多选
  36. multiple: false,
  37. value: '',
  38. tabName: 'data'
  39. },
  40. {
  41. label: '分组',
  42. // 设置组件类型
  43. type: 'select',
  44. // 字段
  45. field: 'seriesField',
  46. // 对应options中的字段
  47. optionField: 'compareField',
  48. // 是否多选
  49. multiple: false,
  50. value: '',
  51. tabName: 'data'
  52. },
  53. /** 样式配置 **/
  54. // 图表 graph
  55. {
  56. label: '方向',
  57. type: 'select', // 设置组件类型
  58. field: 'isTransposed', // 字段
  59. optionField: 'isTransposed', // 对应options中的字段
  60. value: false,
  61. active: true,
  62. inactive: false,
  63. tabName: 'custom',
  64. options: [
  65. {
  66. label: '竖向',
  67. value: false
  68. },
  69. {
  70. label: '横向',
  71. value: true
  72. }
  73. ],
  74. groupName: 'graph'
  75. },
  76. {
  77. label: '标签',
  78. type: 'input', // 设置组件类型
  79. field: 'conversionTagName', // 字段
  80. optionField: 'conversionTagName', // 对应options中的字段
  81. value: '转化率',
  82. tabName: 'custom',
  83. groupName: 'graph'
  84. },
  85. {
  86. label: '标签颜色',
  87. // 设置组件类型
  88. type: 'colorPicker',
  89. // 字段
  90. field: 'conversionTag_style_fill',
  91. // 对应options中的字段
  92. optionField: 'conversionTag.style.fill',
  93. // 绑定的值
  94. value: '#8c8c8c',
  95. tabName: 'custom',
  96. groupName: 'graph'
  97. },
  98. {
  99. label: '标签大小',
  100. // 设置组件类型
  101. type: 'inputNumber',
  102. // 字段
  103. field: 'conversionTag_style_fontSize',
  104. // 对应options中的字段
  105. optionField: 'conversionTag.style.fontSize',
  106. value: 12,
  107. tabName: 'custom',
  108. groupName: 'graph'
  109. },
  110. {
  111. label: '颜色配置',
  112. // 设置组件类型
  113. type: 'colorSelect',
  114. // 字段
  115. field: 'color',
  116. // 对应options中的字段
  117. optionField: 'color',
  118. value: ['#5B8FF9', '#61DDAA', '#5D7092', '#F6BD16', '#6F5EF9', '#6DC8EC', '#945FB9', '#FF9845', '#1E9493', '#FF99C3'],
  119. tabName: 'custom',
  120. groupName: 'graph'
  121. },
  122. {
  123. label: '数据标签颜色',
  124. type: 'colorPicker', // 设置组件类型
  125. field: 'label_style_fill', // 字段
  126. optionField: 'label.style.fill', // 对应options中的字段
  127. value: '#ffffff',
  128. tabName: 'custom',
  129. groupName: 'graph'
  130. },
  131. {
  132. label: '数据标签大小',
  133. // 设置组件类型
  134. type: 'inputNumber',
  135. // 字段
  136. field: 'label_style_fontSize',
  137. // 对应options中的字段
  138. optionField: 'label.style.fontSize',
  139. value: 12,
  140. tabName: 'custom',
  141. groupName: 'graph'
  142. },
  143. // 图例 legend
  144. {
  145. label: '显示',
  146. type: 'switch', // 设置组件类型
  147. field: 'legendEnable', // 字段
  148. optionField: 'legendEnable', // 对应options中的字段
  149. value: false,
  150. active: true,
  151. inactive: false,
  152. tabName: 'custom',
  153. groupName: 'legend'
  154. },
  155. {
  156. label: '位置',
  157. type: 'select', // 设置组件类型
  158. field: 'legendPosition', // 字段
  159. optionField: 'legendPosition', // 对应options中的字段
  160. // 是否多选
  161. multiple: false,
  162. value: 'top',
  163. tabName: 'custom',
  164. options: [
  165. { label: '顶部', value: 'top' },
  166. { label: '左上角', value: 'top-left' },
  167. { label: '右上角', value: 'top-right' },
  168. { label: '左侧', value: 'left' },
  169. // { label: '左上方', value: 'left-top' },
  170. // { label: '左下方', value: 'left-bottom' },
  171. { label: '右侧', value: 'right' },
  172. // { label: '右上方', value: 'right-top' },
  173. // { label: '右下方', value: 'right-bottom' },
  174. { label: '底部', value: 'bottom' },
  175. { label: '左下角', value: 'bottom-left' },
  176. { label: '右下角', value: 'bottom-right' }
  177. ],
  178. groupName: 'legend'
  179. },
  180. {
  181. label: '字体大小',
  182. type: 'inputNumber',
  183. field: 'legendItemName_style_fontSize',
  184. optionField: 'legendItemName.style.fontSize',
  185. value: 12,
  186. tabName: 'custom',
  187. groupName: 'legend'
  188. },
  189. {
  190. label: '字体权重',
  191. type: 'inputNumber',
  192. step: 100,
  193. max: 900,
  194. field: 'legendItemName_style_fontWeight',
  195. optionField: 'legendItemName.style.fontWeight',
  196. value: 400,
  197. tabName: 'custom',
  198. groupName: 'legend'
  199. },
  200. {
  201. label: '字体颜色',
  202. type: 'colorPicker',
  203. field: 'legendItemName_style_fill',
  204. optionField: 'legendItemName.style.fill',
  205. value: '#595959',
  206. tabName: 'custom',
  207. groupName: 'legend'
  208. },
  209. // 边距 padding
  210. {
  211. label: '图表边距',
  212. type: 'padding', // 设置组件类型
  213. field: 'appendPadding', // 字段
  214. optionField: 'appendPadding', // 对应options中的字段
  215. value: [16, 16, 16, 16],
  216. tabName: 'custom',
  217. groupName: 'padding'
  218. }
  219. ]
  220. // 模拟数据
  221. const data = [
  222. { stage: '简历筛选', number: 253, company: 'A公司' },
  223. { stage: '初试人数', number: 151, company: 'A公司' },
  224. { stage: '复试人数', number: 113, company: 'A公司' },
  225. { stage: '录取人数', number: 87, company: 'A公司' },
  226. { stage: '入职人数', number: 59, company: 'A公司' },
  227. { stage: '简历筛选', number: 303, company: 'B公司' },
  228. { stage: '初试人数', number: 251, company: 'B公司' },
  229. { stage: '复试人数', number: 153, company: 'B公司' },
  230. { stage: '录取人数', number: 117, company: 'B公司' },
  231. { stage: '入职人数', number: 79, company: 'B公司' }
  232. ]
  233. // 配置处理脚本
  234. const optionHandler = `option.legend = option.legendEnable ? {position: option.legendPosition}: false;
  235. window.conversionTagName = option.conversionTagName
  236. option.conversionTag.formatter = (datum) => {
  237. return window.conversionTagName + datum.$$percentage$$.toFixed(2) * 100 + '%'
  238. }
  239. if (option.legendEnable) {
  240. option.legend.itemName = option.legendItemName
  241. }
  242. `
  243. // 数据处理脚本
  244. const dataHandler = 'data = data.sort((a, b) => b[option.yField] - a[option.yField])'
  245. // 图表配置 new Line('domName', option)
  246. const option = {
  247. // 数据将要放入到哪个字段中
  248. dataKey: 'data',
  249. data,
  250. color: ['#5B8FF9', '#61DDAA', '#5D7092', '#F6BD16', '#6F5EF9', '#6DC8EC', '#945FB9', '#FF9845', '#1E9493', '#FF99C3'],
  251. appendPadding: [16, 16, 16, 16], // 设置图标的边距
  252. xField: 'stage',
  253. yField: 'number',
  254. compareField: 'company',
  255. isTransposed: false,
  256. legendEnable: false,
  257. legendLayout: 'vertical',
  258. legendPosition: 'top',
  259. legend: false,
  260. legendItemName: {
  261. style: {
  262. fill: '#595959',
  263. fontSize: 12,
  264. fontWeight: 400
  265. }
  266. },
  267. conversionTagName: '转化率 ',
  268. label: { // 图表内的数据标签
  269. // 配置样式
  270. style: {
  271. fill: '#ffffff',
  272. opacity: 1,
  273. fontSize: 12
  274. }
  275. },
  276. conversionTag: {
  277. offsetX: 10,
  278. offsetY: 0,
  279. style: {
  280. fill: '#8c8c8c',
  281. fontSize: 12
  282. },
  283. formatter: (datum) => {
  284. return option.conversionTagName + datum.$$percentage$$.toFixed(2) * 100 + '%'
  285. }
  286. }
  287. }
  288. export default {
  289. category,
  290. version,
  291. title,
  292. chartType,
  293. name,
  294. option,
  295. setting,
  296. optionHandler,
  297. dataHandler
  298. }