pareto.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. <template>
  2. <!-- 优化监控 -->
  3. <!-- 帕雷托图 -->
  4. <div style="width: 100%; height: 100%">
  5. <div class="echartitem" style="width: 100%; height: 100%">
  6. <div
  7. id="pareto"
  8. ref="chartContainer"
  9. style="width: 100%; height: 100%"
  10. ></div>
  11. </div>
  12. </div>
  13. </template>
  14. <script setup>
  15. import { ref, onMounted, reactive, nextTick } from "vue"
  16. import { RouterView, RouterLink } from "vue-router"
  17. import { request, uploadFile } from "@/utils/request"
  18. import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
  19. import * as echarts from "echarts"
  20. import { graphic } from "echarts/core"
  21. const option = ref({})
  22. let myChart
  23. let vars = ref(['变量1','变量2'])
  24. let vals = ref([])
  25. let series = ref([
  26. {
  27. name: "变量1",
  28. type: "scatter",
  29. data: [10, 20, 30, 40] // y轴对应数据
  30. },
  31. {
  32. name: "变量2",
  33. type: "scatter",
  34. data: [20, 10, 40, 30] // y轴对应数据
  35. }
  36. ])
  37. let xdata = ref(['-0.25','0.00','0.25','0.50','0.75','1.00'])
  38. let chartContainer = ref(null)
  39. let chartDom = ref()
  40. let convergeDate = ref([])
  41. let curvedata = ref("")
  42. onMounted(() => {
  43. nextTick(() => {
  44. console.log("onMounted called")
  45. const chartDom = document.getElementById("pareto")
  46. console.log("chartDom:", chartDom) // 检查是否获取到 DOM 元素
  47. if (chartDom) {
  48. myChart = echarts.init(chartDom)
  49. myChart.resize()
  50. setOptionfunc()
  51. }
  52. })
  53. })
  54. const props = defineProps({
  55. paretoshow: {
  56. type: Boolean,
  57. default: false
  58. }
  59. })
  60. // 监听 paretoshow 变化
  61. watch(
  62. () => props.paretoshow,
  63. (newValue) => {
  64. if (newValue) {
  65. nextTick(() => {
  66. const chartDom = chartContainer.value
  67. if (chartDom) {
  68. myChart = echarts.init(chartDom)
  69. myChart.resize() // 手动调整图表大小
  70. setOptionfunc() // 设置图表配置
  71. }
  72. })
  73. }
  74. },
  75. { immediate: true }
  76. )
  77. //初始化
  78. const echatinit = () => {
  79. convergeDate.value = []
  80. series.value = []
  81. xdata.value = []
  82. }
  83. // 数据 从接口处取
  84. const getsockechart = (data) => {
  85. curvedata.value = data
  86. convergeDate.value = []
  87. series.value = []
  88. xdata.value = []
  89. let rows = JSON.parse(curvedata.value)
  90. let num = 0
  91. // 创建一个映射表用于存储变量和对应的数据
  92. let variableMap = {}
  93. for (let i = 0; i < rows.length; i++) {
  94. num += 1
  95. let varsArray = rows[i].vars.split(",") // 变量名列表
  96. let valsArray = rows[i].vals.split(" ").map((str) => Number(str)) // 数据值列表
  97. xdata.value.push(num)
  98. for (let j = 0; j < varsArray.length; j++) {
  99. let varName = varsArray[j]
  100. let varValue = valsArray[j]
  101. // 如果变量名已经存在,则累加数据,否则创建数组
  102. if (!variableMap[varName]) {
  103. variableMap[varName] = []
  104. }
  105. variableMap[varName].push([num, varValue]) // 存储 (x, y) 数据点
  106. }
  107. }
  108. console.log(variableMap)
  109. // 遍历变量映射表,生成 `series` 数据
  110. for (let key in variableMap) {
  111. series.value.push({
  112. name: key,
  113. type: "scatter",
  114. data: variableMap[key], // 直接取出 (x, y) 数据点
  115. itemStyle: {}
  116. })
  117. }
  118. // 更新图表
  119. myChart.setOption({
  120. legend: {
  121. data: Object.keys(variableMap)
  122. },
  123. xAxis: {
  124. data: xdata.value
  125. },
  126. series: series.value
  127. })
  128. }
  129. const setOptionfunc = async () => {
  130. option.value = {
  131. title: {
  132. text: "压力分布",
  133. left: "7%",
  134. top: "5%",
  135. textStyle: {
  136. color: "#333333",
  137. fontSize: 16,
  138. fontWeight: "normal",
  139. fontFamily:'Microsoft YaHei'
  140. }
  141. },
  142. legend: {
  143. show: true,
  144. data: vars.value,
  145. orient: "vertical", // 图例方向 (horizontal水平, vertical垂直)
  146. right: "4%",
  147. top: "2%"
  148. },
  149. grid: {
  150. show: false,
  151. left: "5%",
  152. right: "4%",
  153. bottom: "15%",
  154. containLabel: true
  155. },
  156. tooltip: {
  157. trigger: "axis",
  158. backgroundColor: "rgba(0,0,0,.6)",
  159. borderColor: "rgba(147, 235, 248, .8)",
  160. textStyle: {
  161. color: "#FFF"
  162. }
  163. },
  164. xAxis: [
  165. {
  166. type: "category",
  167. boundaryGap: false,
  168. name: "cd",
  169. nameGap:30,
  170. nameTextStyle:{
  171. fontSize: 16,
  172. color:'#333333',
  173. fontFamily:'Microsoft YaHei'
  174. },
  175. nameLocation: 'middle',
  176. data: xdata.value,
  177. axisLine: {
  178. //X轴线
  179. show: true,
  180. lineStyle: {
  181. color: "#333333", // 线的颜色
  182. width: 1, // 线宽
  183. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  184. }
  185. },
  186. splitLine: {
  187. show: true // 如果不需要网格线,可以设置为 false
  188. },
  189. }
  190. ],
  191. yAxis: {
  192. type: "value",
  193. name:'-cl',
  194. nameGap:40,
  195. nameTextStyle:{
  196. fontSize: 16,
  197. color:'#333333',
  198. fontFamily:'Microsoft YaHei'
  199. },
  200. nameLocation: 'middle',
  201. axisTick: {
  202. show: true
  203. },
  204. splitLine: {
  205. show: true,
  206. },
  207. axisLine: {
  208. //Y轴线
  209. show: true,
  210. lineStyle: {
  211. color: "#333333", // 线的颜色
  212. width: 1, // 线宽
  213. type: "solid" // 线的类型,默认为实线,可选:'solid', 'dashed', 'dotted'
  214. }
  215. }
  216. },
  217. dataZoom: [
  218. {
  219. type: "inside", // 鼠标滚轮缩放
  220. xAxisIndex: [0], // 针对 X 轴
  221. },
  222. {
  223. type: "slider", // 滑动条缩放
  224. xAxisIndex: [0],
  225. }
  226. ],
  227. series: series.value
  228. }
  229. option.value && myChart.setOption(option.value)
  230. window.onresize = function () {
  231. myChart.resize()
  232. }
  233. }
  234. defineExpose({ getsockechart, echatinit })
  235. </script>
  236. <style lang="scss" scoped>
  237. </style>