You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

338 lines
9.3 KiB

  1. <template>
  2. <!-- <div ref="qxnlzhqEchartsRef" id="qxnlzhqEcharts"></div> -->
  3. <div class="qxjmqbox">
  4. <div ref="KlineCanvs" id="qxjmqEcharts" class="qxjmqbox"></div>
  5. </div>
  6. </template>
  7. <script setup>
  8. import { ref, onMounted, onBeforeUnmount, toRef } from "vue";
  9. import * as echarts from "echarts";
  10. import { color } from "echarts/lib/export";
  11. defineExpose({ initQXNLZHEcharts });
  12. const KlineCanvs = ref(null);
  13. let KlineCanvsChart = null;
  14. const heatmapData = ref([]); // 存储热力图数据
  15. // 假数据
  16. const rawData2 = ref([]);
  17. const lineData3 = ref([]);
  18. function initQXNLZHEcharts(kline, qxnlzhqData) {
  19. // qxnlzhqData[9][9]=1
  20. // qxnlzhqData[2][9]=1
  21. rawData2.value = qxnlzhqData;
  22. // 处理热力图数据
  23. const processedHeatmap = [];
  24. // const colorMap = {
  25. // 'transparent': 0,
  26. // 'blue': 1,
  27. // 'pink': 2,
  28. // 'red': 3,
  29. // 'yellow': 4
  30. // };
  31. rawData2.value.forEach((item, dateIndex) => {
  32. const [date, d1, d2, d3, d4, d5, d6, d7, d8, d9] = item;
  33. // processedHeatmap.push([dateIndex, 0, d4 , d8 == 1 ?'blue' :'transparent']); // 数据1
  34. // processedHeatmap.push([dateIndex, 1, d3 , d7 == 1 ?'pink' :'transparent']); // 数据2
  35. // processedHeatmap.push([dateIndex, 2, d2 , d6 == 1 ?'red' :'transparent']); // 数据3
  36. // processedHeatmap.push([dateIndex, 3, d1 , d5 == 1 ?'yellow' :'transparent']); // 数据4
  37. // processedHeatmap.push([dateIndex, 0, d4, colorMap[d8 == 1 ? 'blue' : 'transparent']]); // 数据1
  38. // processedHeatmap.push([dateIndex, 1, d3, colorMap[d7 == 1 ? 'pink' : 'transparent']]); // 数据2
  39. // processedHeatmap.push([dateIndex, 2, d2, colorMap[d6 == 1 ? 'red' : 'transparent']]); // 数据3
  40. // processedHeatmap.push([dateIndex, 3, d1, colorMap[d5 == 1 ? 'yellow' : 'transparent']]); // 数据4
  41. // processedHeatmap.push([dateIndex, 0, d4, d8 === 1 ? -1 : 0]); // -1: blue
  42. // processedHeatmap.push([dateIndex, 1, d3, d7 === 1 ? -2 : 0]); // -2: pink
  43. // processedHeatmap.push([dateIndex, 2, d2, d6 === 1 ? -3 : 0]); // -3: red
  44. // processedHeatmap.push([dateIndex, 3, d1, d5 === 1 ? -4 : 0]); // -4: yellow
  45. });
  46. heatmapData.value = processedHeatmap; //[0, 1, 'orange']
  47. // 处理折线图数据
  48. lineData3.value = rawData2.value.map((item) => item[9]);
  49. // console.log('k图:', rawData2.value)
  50. console.log("热力图数据:", heatmapData.value);
  51. console.log("折线图数据:", lineData3.value);
  52. const data = kline;
  53. // 切割数据方法
  54. const spliteDate = (a) => {
  55. const categoryData = [];
  56. let value = [];
  57. for (let i = 0; i < a.length; i++) {
  58. categoryData.push(a[i].splice(0, 1)[0]);
  59. value.push(a[i]);
  60. }
  61. return { categoryData, value };
  62. };
  63. const dealData = spliteDate(data);
  64. // 给配置项
  65. const KlineOption = {
  66. tooltip: {
  67. trigger: "item", // 触发类型 坐标轴触发
  68. },
  69. //控制坐标轴
  70. grid: [
  71. { top: "5%", height: "40%" },
  72. { top: "45%", height: "35%" },
  73. { top: "80%", height: "2%" },
  74. ],
  75. visualMap: [
  76. {
  77. show: false, // 不显示控制条
  78. seriesIndex: 1, // 作用于热力图的系列
  79. min: 0,
  80. max: 2000, // 根据您的数据范围调整
  81. calculable: true,
  82. orient: "horizontal",
  83. left: "center",
  84. bottom: "15%",
  85. inRange: {
  86. color: ["transparent"],
  87. },
  88. dimension: 3, // 指定使用第4个维度(索引从0开始)
  89. // pieces: [
  90. // { value: -1, borderColor: '#1E90FF' }, // blue
  91. // { value: -2, borderColor: '#FF69B4' }, // pink
  92. // { value: -3, borderColor: '#FF0000' }, // red
  93. // { value: -4, borderColor: '#FFFF00' }, // yellow
  94. // { value: 0, borderColor: 'transparent' } // 默认透明
  95. // ]
  96. },
  97. ],
  98. // 横坐标内容
  99. xAxis: [
  100. {
  101. type: "category",
  102. gridIndex: 0,
  103. data: dealData.categoryData,
  104. axisPointer: {
  105. show: true,
  106. type: "shadow",
  107. },
  108. axisTick: { show: false }, // 隐藏刻度线
  109. axisLabel: { show: false, rotate: 45 }, // 隐藏刻度标签
  110. axisLine: {
  111. show: true,
  112. lineStyle: {
  113. color: "grey",
  114. },
  115. },
  116. },
  117. {
  118. type: "category",
  119. gridIndex: 1,
  120. data: dealData.categoryData,
  121. axisTick: { show: false }, // 隐藏刻度线
  122. axisLabel: { show: false, rotate: 45 }, // 隐藏刻度标签
  123. splitLine: {
  124. show: true,
  125. lineStyle: {
  126. color: "white",
  127. // 间隔线类型实线
  128. type: "solid",
  129. },
  130. interval: 0,
  131. },
  132. },
  133. {
  134. type: "category",
  135. gridIndex: 2,
  136. data: dealData.categoryData,
  137. axisLine: { lineStyle: { color: "#8392A5" } },
  138. },
  139. ],
  140. yAxis: [
  141. {
  142. scale: true,
  143. axisLabel: {
  144. formatter: function (value) {
  145. return value;
  146. },
  147. },
  148. axisLine: {
  149. show: true,
  150. lineStyle: { color: "#8392A5" },
  151. },
  152. splitLine: {
  153. show: false,
  154. },
  155. axisPointer: {
  156. show: true,
  157. label: {
  158. show: true,
  159. },
  160. type: "line",
  161. },
  162. },
  163. {
  164. gridIndex: 1,
  165. type: "category",
  166. data: [0, 1, 2, 3], // 倒序显示
  167. axisLine: { lineStyle: { color: "#8392A5" } },
  168. axisLabel: {
  169. show: true, // 显示刻度标签
  170. color: "#fff", // 白色文字
  171. backgroundColor: "transparent",
  172. fontSize: 12,
  173. margin: 8,
  174. },
  175. axisTick: { show: false }, // 隐藏刻度线
  176. splitLine: {
  177. show: true,
  178. lineStyle: {
  179. color: "#8392A5",
  180. width: 1,
  181. type: "solid",
  182. },
  183. interval: 0, // 强制显示间隔
  184. },
  185. },
  186. {
  187. gridIndex: 2,
  188. type: "value",
  189. axisLine: {
  190. show: true,
  191. lineStyle: { color: "#FED88D" },
  192. },
  193. splitLine: {
  194. show: !1,
  195. },
  196. axisTick: { show: false }, // 隐藏刻度线
  197. axisLabel: { show: false }, // 隐藏刻度标签
  198. },
  199. ],
  200. // 下拉条
  201. dataZoom: [
  202. {
  203. textStyle: {
  204. color: "white", // 字体颜色
  205. },
  206. handleIcon:
  207. "M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z",
  208. handleSize: "80%",
  209. dataBackground: {
  210. areaStyle: {
  211. color: "#8392A5",
  212. },
  213. lineStyle: {
  214. opacity: 0.8,
  215. color: "#8392A5",
  216. },
  217. },
  218. xAxisIndex: [0, 1, 2],
  219. handleStyle: {
  220. color: "#fff",
  221. shadowBlur: 3,
  222. shadowColor: "rgba(0, 0, 0, 0.6)",
  223. shadowOffsetX: 2,
  224. shadowOffsetY: 2,
  225. },
  226. bottom: "0%", // 下移数据缩放滑块
  227. },
  228. {
  229. show: !1,
  230. type: "slider",
  231. },
  232. {
  233. type: "inside",
  234. },
  235. ],
  236. series: [
  237. {
  238. type: "candlestick",
  239. name: "\u65e5K",
  240. // 数据
  241. data: dealData.value,
  242. itemStyle: {
  243. normal: {
  244. color0: "red", // 阴线颜色
  245. color: "#0CF49B", // 阳线颜色
  246. borderColor0: "#FD1050", // 阴线边框颜色
  247. borderColor: "#0CF49B", // 阳线边框颜色
  248. },
  249. },
  250. },
  251. // 副图热力矩阵
  252. {
  253. name: "热力矩阵",
  254. type: "heatmap",
  255. gridIndex: 1,
  256. xAxisIndex: 1,
  257. yAxisIndex: 1,
  258. data: processedHeatmap,
  259. // data: [
  260. // [0, 0, 116, "#0CF49B"], // [x, y, value, borderColor]
  261. // [0, 1, 20, "#FF5733"],
  262. // [1, 1, 50, "#FFC300"],
  263. // ],
  264. coordinateSystem: "cartesian2d",
  265. label: {
  266. normal: {
  267. show: true,
  268. color: "#fff", // 文本颜色
  269. formatter: function (params) {
  270. return params.value[2]; // 低版本使用 params.value 访问完整数据
  271. },
  272. },
  273. },
  274. itemStyle: {
  275. normal: {
  276. color: "transparent",
  277. borderWidth: 2
  278. }
  279. },
  280. emphasis: {
  281. itemStyle: {
  282. shadowBlur: 10,
  283. shadowColor: "rgba(0, 0, 0, 0.5)",
  284. },
  285. },
  286. },
  287. {
  288. name: "凸起",
  289. type: "line",
  290. xAxisIndex: 2,
  291. yAxisIndex: 2,
  292. data: lineData3.value,
  293. color: "black",
  294. lineStyle: {
  295. color: "white", // 线的颜色
  296. },
  297. symbol: "none", // 去掉点
  298. },
  299. ],
  300. };
  301. // 创造echarts图
  302. KlineCanvsChart = echarts.init(KlineCanvs.value);
  303. KlineCanvsChart.setOption(KlineOption);
  304. // 窗口大小变化时重置图表大小
  305. window.addEventListener("resize", () => {
  306. KlineCanvsChart.resize();
  307. });
  308. }
  309. const windowHeight = ref(window.innerHeight);
  310. const updateHeight = () => {
  311. windowHeight.value = window.innerHeight; // 更新响应式变量
  312. };
  313. onMounted(() => {
  314. window.addEventListener("resize", updateHeight); // 监听窗口变化
  315. });
  316. onBeforeUnmount(() => {
  317. // 组件卸载时销毁图表
  318. if (KlineCanvsChart) {
  319. KlineCanvsChart.dispose();
  320. }
  321. });
  322. </script>
  323. <style scoped>
  324. .qxjmqbox {
  325. background-color: #131a2a;
  326. }
  327. #qxjmqEcharts {
  328. width: 100%;
  329. height: 600px;
  330. }
  331. </style>