data-fixers.ts 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /**
  2. * 数据修正函数模块
  3. * 用于修正柱状图和条形图的数据点位置和宽度
  4. */
  5. // @ts-nocheck - 为了与原始 u-charts 代码保持兼容性,跳过类型检查
  6. import type { ChartOptions, UChartsConfig } from '../data-processing/index';
  7. // 使用 any 类型来简化与原始 u-charts 代码的兼容性
  8. type AnyChartOptions = any;
  9. /**
  10. * 修正柱状图数据
  11. * @param points 数据点数组
  12. * @param eachSpacing 每个数据点的间距
  13. * @param columnLen 柱状图系列数量
  14. * @param index 当前系列索引
  15. * @param config 图表配置
  16. * @param opts 图表配置选项
  17. * @returns 修正后的数据点数组
  18. */
  19. export function fixColumeData(
  20. points: Array<{ x: number; width?: number } | null>,
  21. eachSpacing: number,
  22. columnLen: number,
  23. index: number,
  24. config: UChartsConfig,
  25. opts: AnyChartOptions
  26. ): Array<{ x: number; width: number } | null> {
  27. return points.map(function (item, itemIndex) {
  28. if (item === null) {
  29. return null;
  30. }
  31. let seriesGap = 0;
  32. let categoryGap = 0;
  33. if (opts.type === 'mix') {
  34. seriesGap = opts.extra?.mix?.column?.seriesGap
  35. ? opts.extra.mix.column.seriesGap * opts.pix
  36. : 0;
  37. categoryGap = opts.extra?.mix?.column?.categoryGap
  38. ? opts.extra.mix.column.categoryGap * opts.pix
  39. : 0;
  40. } else {
  41. seriesGap = opts.extra?.column?.seriesGap
  42. ? opts.extra.column.seriesGap * opts.pix
  43. : 0;
  44. categoryGap = opts.extra?.column?.categoryGap
  45. ? opts.extra.column.categoryGap * opts.pix
  46. : 0;
  47. }
  48. seriesGap = Math.min(seriesGap, eachSpacing / columnLen);
  49. categoryGap = Math.min(categoryGap, eachSpacing / columnLen);
  50. (item as any).width = Math.ceil(
  51. (eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) /
  52. columnLen
  53. );
  54. const widthBeforeLimit = (item as any).width;
  55. if (
  56. opts.extra?.mix?.column?.width &&
  57. +opts.extra.mix.column.width > 0
  58. ) {
  59. (item as any).width = Math.min(
  60. (item as any).width,
  61. +opts.extra.mix.column.width * opts.pix
  62. );
  63. }
  64. if (
  65. opts.extra?.column?.width &&
  66. +opts.extra.column.width > 0
  67. ) {
  68. (item as any).width = Math.min(
  69. (item as any).width,
  70. +opts.extra.column.width * opts.pix
  71. );
  72. }
  73. if ((item as any).width <= 0) {
  74. (item as any).width = 1;
  75. }
  76. const originalX = item.x;
  77. item.x += (index + 0.5 - columnLen / 2) * ((item as any).width + seriesGap);
  78. return item as { x: number; width: number };
  79. });
  80. }
  81. /**
  82. * 修正条形图数据
  83. * @param points 数据点数组
  84. * @param eachSpacing 每个数据点的间距
  85. * @param columnLen 条形图系列数量
  86. * @param index 当前系列索引
  87. * @param config 图表配置
  88. * @param opts 图表配置选项
  89. * @returns 修正后的数据点数组
  90. */
  91. export function fixBarData(
  92. points: Array<{ y: number; width?: number } | null>,
  93. eachSpacing: number,
  94. columnLen: number,
  95. index: number,
  96. config: UChartsConfig,
  97. opts: AnyChartOptions
  98. ): Array<{ y: number; width: number } | null> {
  99. return points.map(function (item) {
  100. if (item === null) {
  101. return null;
  102. }
  103. let seriesGap = 0;
  104. let categoryGap = 0;
  105. seriesGap = opts.extra?.bar?.seriesGap ? opts.extra.bar.seriesGap * opts.pix : 0;
  106. categoryGap = opts.extra?.bar?.categoryGap
  107. ? opts.extra.bar.categoryGap * opts.pix
  108. : 0;
  109. seriesGap = Math.min(seriesGap, eachSpacing / columnLen);
  110. categoryGap = Math.min(categoryGap, eachSpacing / columnLen);
  111. (item as any).width = Math.ceil(
  112. (eachSpacing - 2 * categoryGap - seriesGap * (columnLen - 1)) /
  113. columnLen
  114. );
  115. if (opts.extra?.bar?.width && +opts.extra.bar.width > 0) {
  116. (item as any).width = Math.min(
  117. (item as any).width,
  118. +opts.extra.bar.width * opts.pix
  119. );
  120. }
  121. if ((item as any).width <= 0) {
  122. (item as any).width = 1;
  123. }
  124. (item as any).y += (index + 0.5 - columnLen / 2) * ((item as any).width + seriesGap);
  125. return item as { y: number; width: number };
  126. });
  127. }
  128. /**
  129. * 修正仪表盘柱状图数据
  130. * @param points 数据点数组
  131. * @param eachSpacing 每个数据点的间距
  132. * @param columnLen 柱状图系列数量
  133. * @param index 当前系列索引
  134. * @param config 图表配置
  135. * @param opts 图表配置选项
  136. * @param border 边框宽度
  137. * @returns 修正后的数据点数组
  138. */
  139. export function fixColumeMeterData(
  140. points: Array<{ width?: number } | null>,
  141. eachSpacing: number,
  142. columnLen: number,
  143. index: number,
  144. config: UChartsConfig,
  145. opts: AnyChartOptions,
  146. border: number
  147. ): Array<{ width: number } | null> {
  148. const categoryGap = opts.extra?.column?.categoryGap
  149. ? opts.extra.column.categoryGap * opts.pix
  150. : 0;
  151. return points.map(function (item) {
  152. if (item === null) {
  153. return null;
  154. }
  155. (item as any).width = eachSpacing - 2 * categoryGap;
  156. if (opts.extra?.column?.width && +opts.extra.column.width > 0) {
  157. (item as any).width = Math.min(
  158. (item as any).width,
  159. +opts.extra.column.width * opts.pix
  160. );
  161. }
  162. if (index > 0) {
  163. (item as any).width -= border;
  164. }
  165. return item as { width: number };
  166. });
  167. }
  168. /**
  169. * 修正堆叠柱状图数据
  170. * @param points 数据点数组
  171. * @param eachSpacing 每个数据点的间距
  172. * @param columnLen 柱状图系列数量
  173. * @param index 当前系列索引
  174. * @param config 图表配置
  175. * @param opts 图表配置选项
  176. * @param series 数据系列
  177. * @returns 修正后的数据点数组
  178. */
  179. export function fixColumeStackData(
  180. points: Array<{ width?: number } | null>,
  181. eachSpacing: number,
  182. columnLen: number,
  183. index: number,
  184. config: UChartsConfig,
  185. opts: AnyChartOptions,
  186. series: any[]
  187. ): Array<{ width: number } | null> {
  188. const categoryGap = opts.extra?.column?.categoryGap
  189. ? opts.extra.column.categoryGap * opts.pix
  190. : 0;
  191. return points.map(function (item) {
  192. if (item === null) {
  193. return null;
  194. }
  195. (item as any).width = Math.ceil(eachSpacing - 2 * categoryGap);
  196. if (opts.extra?.column?.width && +opts.extra.column.width > 0) {
  197. (item as any).width = Math.min(
  198. (item as any).width,
  199. +opts.extra.column.width * opts.pix
  200. );
  201. }
  202. if ((item as any).width <= 0) {
  203. (item as any).width = 1;
  204. }
  205. return item as { width: number };
  206. });
  207. }
  208. /**
  209. * 修正堆叠条形图数据
  210. * @param points 数据点数组
  211. * @param eachSpacing 每个数据点的间距
  212. * @param columnLen 条形图系列数量
  213. * @param index 当前系列索引
  214. * @param config 图表配置
  215. * @param opts 图表配置选项
  216. * @param series 数据系列
  217. * @returns 修正后的数据点数组
  218. */
  219. export function fixBarStackData(
  220. points: Array<{ width?: number } | null>,
  221. eachSpacing: number,
  222. columnLen: number,
  223. index: number,
  224. config: UChartsConfig,
  225. opts: AnyChartOptions,
  226. series: any[]
  227. ): Array<{ width: number } | null> {
  228. const categoryGap = opts.extra?.bar?.categoryGap
  229. ? opts.extra.bar.categoryGap * opts.pix
  230. : 0;
  231. return points.map(function (item) {
  232. if (item === null) {
  233. return null;
  234. }
  235. (item as any).width = Math.ceil(eachSpacing - 2 * categoryGap);
  236. if (opts.extra?.bar?.width && +opts.extra.bar.width > 0) {
  237. (item as any).width = Math.min(
  238. (item as any).width,
  239. +opts.extra.bar.width * opts.pix
  240. );
  241. }
  242. if ((item as any).width <= 0) {
  243. (item as any).width = 1;
  244. }
  245. return item as { width: number };
  246. });
  247. }