|
|
@@ -1,22 +1,19 @@
|
|
|
-<!--
|
|
|
- * @Author: your name
|
|
|
- * @Date: 2024-09-11 14:36:31
|
|
|
- * @LastEditTime: 2025-02-12 15:17:50
|
|
|
- * @LastEditors: bogon
|
|
|
- * @Description: In User Settings Edit
|
|
|
- * @FilePath: /performance-test/src/views/performance/components/chartsCom/BoxMarkersCharts.vue
|
|
|
--->
|
|
|
-<!-- <template>
|
|
|
- <div> -->
|
|
|
-<!-- BoxMarkersCharts
|
|
|
- <h1>叶尖速比时序分析</h1>
|
|
|
- <h1>风能利用系数时序分析</h1> -->
|
|
|
-<!-- <div :id="`chart-${inds}`" style="width: 100%; height: 550px"></div>
|
|
|
- </div>
|
|
|
-</template>
|
|
|
- -->
|
|
|
<template>
|
|
|
- <div>
|
|
|
+ <div style="width: 100%; height: 500px">
|
|
|
+ <!-- 时间范围选择器 -->
|
|
|
+ <el-date-picker
|
|
|
+ size="mini"
|
|
|
+ v-model="dateRange"
|
|
|
+ type="daterange"
|
|
|
+ align="right"
|
|
|
+ unlink-panels
|
|
|
+ range-separator="至"
|
|
|
+ start-placeholder="开始日期"
|
|
|
+ end-placeholder="结束日期"
|
|
|
+ @change="onDateRangeChange"
|
|
|
+ style="margin: 20px 0 0 0"
|
|
|
+ ></el-date-picker>
|
|
|
+
|
|
|
<div
|
|
|
v-loading="loading"
|
|
|
ref="plotlyChart"
|
|
|
@@ -31,6 +28,7 @@
|
|
|
import Plotly from "plotly.js-dist-min";
|
|
|
import axios from "axios";
|
|
|
import { myMixin } from "@/mixins/chartRequestMixin";
|
|
|
+
|
|
|
export default {
|
|
|
name: "BoxPlotWithMedians",
|
|
|
mixins: [myMixin],
|
|
|
@@ -45,24 +43,28 @@ export default {
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
- chartData: {},
|
|
|
+ chartData: {}, // 存储从 API 获取的原始数据
|
|
|
+ dateRange: [], // 日期范围选择器的值
|
|
|
+ loading: false,
|
|
|
+ isError: false,
|
|
|
};
|
|
|
},
|
|
|
mounted() {
|
|
|
- this.getData();
|
|
|
+ this.getData(); // 获取数据
|
|
|
},
|
|
|
methods: {
|
|
|
+ // 获取数据
|
|
|
async getData() {
|
|
|
if (this.fileAddr !== "") {
|
|
|
try {
|
|
|
this.loading = true;
|
|
|
this.cancelToken = axios.CancelToken.source();
|
|
|
- console.log(this.cancelToken);
|
|
|
+
|
|
|
const resultChartsData = await axios.get(this.fileAddr, {
|
|
|
cancelToken: this.cancelToken.token,
|
|
|
});
|
|
|
this.chartData = resultChartsData.data;
|
|
|
- this.drawBoxPlot();
|
|
|
+ this.drawBoxPlot(); // 绘制图表
|
|
|
this.isError = false;
|
|
|
this.loading = false;
|
|
|
} catch (error) {
|
|
|
@@ -71,16 +73,60 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
+
|
|
|
+ // 处理日期范围变化
|
|
|
+ onDateRangeChange() {
|
|
|
+ this.drawBoxPlot(); // 日期变化时重新绘制图表
|
|
|
+ },
|
|
|
+
|
|
|
+ // 判断时间戳是否在选择的日期范围内
|
|
|
+ isInDateRange(timestamp) {
|
|
|
+ const [startDate, endDate] = this.dateRange;
|
|
|
+ if (!startDate || !endDate) return true;
|
|
|
+
|
|
|
+ const date = new Date(timestamp);
|
|
|
+ return date >= new Date(startDate) && date <= new Date(endDate);
|
|
|
+ },
|
|
|
+
|
|
|
+ // 过滤数据
|
|
|
+ filterData(group) {
|
|
|
+ const filteredXData = [];
|
|
|
+ const filteredYData = [];
|
|
|
+ const filteredMedians = group.medians ? { x: [], y: [] } : null;
|
|
|
+ group.medians.x.forEach((timestamp, index) => {
|
|
|
+ if (this.isInDateRange(timestamp)) {
|
|
|
+ filteredMedians.x.push(timestamp);
|
|
|
+ filteredMedians.y.push(group.medians.y[index]);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ group.xData.forEach((timestamp, index) => {
|
|
|
+ if (this.isInDateRange(timestamp)) {
|
|
|
+ filteredXData.push(timestamp);
|
|
|
+ filteredYData.push(group.yData[index]);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return {
|
|
|
+ ...group,
|
|
|
+ xData: filteredXData,
|
|
|
+ yData: filteredYData,
|
|
|
+ medians: filteredMedians,
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ // 绘制箱线图
|
|
|
drawBoxPlot() {
|
|
|
const chartContainer = this.$refs.plotlyChart;
|
|
|
const { data, xaixs, yaixs, analysisTypeCode } = this.chartData;
|
|
|
|
|
|
+ // 过滤数据,根据选定的日期范围
|
|
|
+ const filteredData = data.map(this.filterData);
|
|
|
+
|
|
|
+ // 创建图表数据
|
|
|
const traces = [];
|
|
|
const medianMarkers = [];
|
|
|
|
|
|
- // 处理每组数据
|
|
|
- data.forEach((group) => {
|
|
|
- // 添加箱线图
|
|
|
+ filteredData.forEach((group) => {
|
|
|
traces.push({
|
|
|
x: group.xData,
|
|
|
y: group.yData,
|
|
|
@@ -89,19 +135,19 @@ export default {
|
|
|
marker: {
|
|
|
color: group.color,
|
|
|
},
|
|
|
- boxmean: true, // 显示均值
|
|
|
+ boxpoints: false,
|
|
|
+ boxmean: false,
|
|
|
});
|
|
|
|
|
|
- // 添加中位点
|
|
|
- if (group.medians) {
|
|
|
+ // 如果有中位点数据且中位点数据不为空,添加中位点
|
|
|
+ if (group.medians && group.medians.x.length > 0) {
|
|
|
medianMarkers.push({
|
|
|
x: group.medians.x,
|
|
|
y: group.medians.y,
|
|
|
- mode: group.medians.mode,
|
|
|
+ mode: "markers",
|
|
|
marker: {
|
|
|
color: "#406DAB",
|
|
|
- // color: group.medians.color,
|
|
|
- size: group.medians.size,
|
|
|
+ size: 3,
|
|
|
},
|
|
|
name: `${group.title} - 中位点`,
|
|
|
type: "scatter",
|
|
|
@@ -113,6 +159,8 @@ export default {
|
|
|
title: analysisTypeCode + data[0].engineName,
|
|
|
xaxis: {
|
|
|
title: xaixs,
|
|
|
+ type: "date",
|
|
|
+ tickformat: "%Y-%m-%d",
|
|
|
},
|
|
|
yaxis: {
|
|
|
title: yaixs,
|
|
|
@@ -120,7 +168,6 @@ export default {
|
|
|
showlegend: true,
|
|
|
};
|
|
|
|
|
|
- // 绘制图表
|
|
|
Plotly.newPlot(chartContainer, [...traces, ...medianMarkers], layout);
|
|
|
},
|
|
|
},
|