Radar.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <template>
  2. <div
  3. ref="radarChart"
  4. style="width: 100%; height: 400px; min-width: 400px"
  5. ></div>
  6. </template>
  7. <script>
  8. import * as echarts from "echarts";
  9. export default {
  10. props: {
  11. chartData: {
  12. type: Object,
  13. default: {},
  14. },
  15. itemCsvData: {
  16. type: Array,
  17. default: [],
  18. },
  19. machineTypeCode: {
  20. type: String,
  21. default: "",
  22. },
  23. },
  24. watch: {
  25. chartData: {
  26. deep: true,
  27. // immediate: true,
  28. handler() {
  29. if (this.chartData && this.itemCsvData.length > 0) {
  30. this.calculateValues();
  31. this.drawRadarChart();
  32. }
  33. },
  34. },
  35. itemCsvData: {
  36. handler() {
  37. if (this.chartData && this.itemCsvData.length > 0) {
  38. this.calculateValues();
  39. this.drawRadarChart();
  40. }
  41. },
  42. deep: true,
  43. // immediate: true,
  44. },
  45. },
  46. data() {
  47. return {
  48. maxValues: [],
  49. minValues: [],
  50. medianValues: [],
  51. };
  52. },
  53. mounted() {
  54. this.$nextTick(() => {
  55. if (this.chartData && this.itemCsvData.length > 0) {
  56. this.calculateValues();
  57. this.drawRadarChart();
  58. }
  59. });
  60. // 监听窗口大小变化,手动调用 resize 方法
  61. window.addEventListener("resize", this.resizeChart);
  62. },
  63. beforeDestroy() {
  64. // 清除事件监听
  65. window.removeEventListener("resize", this.resizeChart);
  66. },
  67. methods: {
  68. // 计算最大值、最小值和中位值
  69. calculateValues() {
  70. const data = this.itemCsvData.map((item) => [
  71. item.TurbinePowerRate,
  72. item.TurbineRunRate,
  73. item.WindSpeedAvr,
  74. item.Thi,
  75. item.Ws,
  76. ]);
  77. // 计算最大值
  78. this.maxValues = data[0].map((_, colIndex) =>
  79. Math.max(...data.map((row) => row[colIndex]))
  80. );
  81. // 计算最小值
  82. this.minValues = data[0].map((_, colIndex) =>
  83. Math.min(...data.map((row) => row[colIndex]))
  84. );
  85. // 计算中位值
  86. this.medianValues = this.calculateMedian(data);
  87. },
  88. // 计算每列的中位值
  89. calculateMedian(data) {
  90. return data[0].map((_, colIndex) => {
  91. const columnData = data
  92. .map((row) => parseFloat(row[colIndex])) // 将字符串转换为数字
  93. .sort((a, b) => a - b); // 数字排序
  94. const mid = Math.floor(columnData.length / 2);
  95. return columnData.length % 2 === 0
  96. ? (columnData[mid - 1] + columnData[mid]) / 2
  97. : columnData[mid];
  98. });
  99. },
  100. // 渲染雷达图
  101. drawRadarChart() {
  102. // 获取数据
  103. const values = [
  104. this.chartData.TurbinePowerRate,
  105. this.chartData.TurbineRunRate,
  106. this.chartData.WindSpeedAvr,
  107. this.chartData.Thi,
  108. this.chartData.Ws,
  109. ];
  110. // 将中位值存入 window,确保 tooltip 访问
  111. window.medianValues = this.medianValues;
  112. // 雷达图的指示器,使用最大值、最小值和中位值来动态设置
  113. const indicators = [
  114. {
  115. name: "风机能量利用率",
  116. max: this.maxValues[0],
  117. min: this.minValues[0],
  118. },
  119. {
  120. name: "风机可利用率",
  121. max: this.maxValues[1],
  122. min: this.minValues[1],
  123. },
  124. { name: "平均风速", max: this.maxValues[2], min: this.minValues[2] },
  125. {
  126. name: "等效利用小时",
  127. max: this.maxValues[3],
  128. min: this.minValues[3],
  129. },
  130. {
  131. name: "功率曲线一致性系数",
  132. max: this.maxValues[4],
  133. min: this.minValues[4],
  134. },
  135. ];
  136. // 构建 ECharts 配置项
  137. console.log(this.machineTypeCode, " this.machineTypeCode");
  138. const option = {
  139. // backgroundColor: 'rgba(240, 240, 240, 0.5)', // 整体背景颜色
  140. title: {
  141. text:
  142. this.machineTypeCode +
  143. "机型" +
  144. this.chartData.wind_turbine_name +
  145. "机组指标",
  146. left: "center",
  147. textStyle: {
  148. fontSize: 16, // 设置字体大小为 16px
  149. },
  150. },
  151. tooltip: {
  152. trigger: "item",
  153. z: 999999999999,
  154. appendToBody: true, // 强制添加到 body
  155. formatter: (params) => {
  156. const indicators = [
  157. { label: "风机能量利用率", unit: " %" },
  158. { label: "风机可利用率", unit: " %" },
  159. { label: "平均风速", unit: " m/s" },
  160. { label: "利用小时", unit: " h" },
  161. { label: "功率曲线一致性系数", unit: " %" },
  162. ];
  163. const values = params.value;
  164. const medianValues = window.medianValues || [];
  165. let content = `<strong>${params.seriesName}</strong><br/>`;
  166. for (let i = 0; i < indicators.length; i++) {
  167. content += `${indicators[i].label}: ${values[i]}${
  168. indicators[i].unit
  169. }<br/>中位值: ${parseFloat(medianValues[i].toFixed(3))}${
  170. indicators[i].unit
  171. }<br/><br/>`;
  172. }
  173. return content;
  174. },
  175. },
  176. radar: {
  177. indicator: indicators,
  178. center: ["45%", "45%"],
  179. radius: "50%",
  180. splitNumber: 5,
  181. splitArea: {
  182. show: true,
  183. areaStyle: {
  184. color: [
  185. "rgba(200, 200, 200, 0.1)",
  186. "rgba(rgba(200, 200, 200, 0.1)",
  187. ], // 交替背景色
  188. },
  189. },
  190. },
  191. toolbox: {
  192. feature: {
  193. saveAsImage: { show: true },
  194. },
  195. },
  196. series: [
  197. {
  198. name: this.chartData.wind_turbine_name + "机组指标",
  199. type: "radar",
  200. data: [
  201. {
  202. value: values,
  203. name: this.chartData.wind_turbine_name + "机组指标",
  204. lineStyle: {
  205. width: 2,
  206. color: "#636efc",
  207. },
  208. areaStyle: {
  209. color: "rgba(99, 110, 252, 0.3)",
  210. },
  211. },
  212. ],
  213. },
  214. {
  215. name: "中位值",
  216. type: "radar",
  217. data: [
  218. {
  219. value: this.medianValues,
  220. name: "中位值",
  221. lineStyle: {
  222. width: 2,
  223. color: "#f39c12",
  224. type: "dashed",
  225. },
  226. },
  227. ],
  228. },
  229. ],
  230. };
  231. // 使用 ECharts 渲染雷达图
  232. const chart = echarts.init(this.$refs.radarChart);
  233. chart.setOption(option);
  234. },
  235. // 图表调整大小
  236. resizeChart() {
  237. const chart = echarts.getInstanceByDom(this.$refs.radarChart);
  238. if (chart) {
  239. chart.resize();
  240. }
  241. },
  242. },
  243. };
  244. </script>