|
@@ -1,7 +1,7 @@
|
|
|
<!--
|
|
|
* @Author: your name
|
|
|
* @Date: 2024-09-11 14:32:12
|
|
|
- * @LastEditTime: 2025-02-12 16:27:11
|
|
|
+ * @LastEditTime: 2025-02-17 16:55:46
|
|
|
* @LastEditors: bogon
|
|
|
* @Description: In User Settings Edit
|
|
|
* @FilePath: /performance-test/src/views/performance/components/chartsCom/powerMarkers2DCharts.vue
|
|
@@ -11,22 +11,43 @@
|
|
|
<!-- powerMarkers2DCharts
|
|
|
<h1>逐月有功功率散点2D分析</h1> -->
|
|
|
<!-- <h1>偏航控制策略异常检测 2D</h1> 目前没找到这个分析类型-->
|
|
|
-
|
|
|
<template>
|
|
|
<div style="min-height: 300px">
|
|
|
<!-- 2D散点图 -->
|
|
|
<template>
|
|
|
<div style="display: flex; align-items: center; margin-top: 20px">
|
|
|
<div style="margin-right: 20px; display: flex; align-items: center">
|
|
|
- <el-color-picker
|
|
|
+ <el-select
|
|
|
size="small"
|
|
|
v-model="color1"
|
|
|
- show-alpha
|
|
|
@change="updateChartColor"
|
|
|
- ></el-color-picker>
|
|
|
- <span style="margin-left: 10px">自定义颜色</span>
|
|
|
+ placeholder="选择配色方案"
|
|
|
+ style="width: 200px"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="(scheme, index) in colorSchemes"
|
|
|
+ :key="index"
|
|
|
+ :label="scheme.label"
|
|
|
+ :value="scheme.colors"
|
|
|
+ :style="getOptionStyle(scheme.colors)"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <!-- 点大小控制 -->
|
|
|
+ <div style="display: flex; align-items: center">
|
|
|
+ <!-- <span style="margin-right: 10px">点大小</span> -->
|
|
|
+ <el-slider
|
|
|
+ v-model="pointSize"
|
|
|
+ :min="3"
|
|
|
+ :max="15"
|
|
|
+ :step="1"
|
|
|
+ label="点的大小"
|
|
|
+ show-stops
|
|
|
+ style="width: 150px"
|
|
|
+ @change="updateChartColor"
|
|
|
+ ></el-slider>
|
|
|
+ </div>
|
|
|
<div
|
|
|
v-loading="loading"
|
|
|
:ref="`plotlyChart-${index}`"
|
|
@@ -42,7 +63,7 @@
|
|
|
import Plotly from "plotly.js-dist";
|
|
|
import axios from "axios";
|
|
|
import { myMixin } from "@/mixins/chartRequestMixin";
|
|
|
-
|
|
|
+import { colorSchemes } from "@/views/overview/js/colors";
|
|
|
export default {
|
|
|
mixins: [myMixin],
|
|
|
props: {
|
|
@@ -56,28 +77,42 @@ export default {
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
+ pointSize: 5, // 默认点大小
|
|
|
chartData: {},
|
|
|
chartType: "scatter", // 默认显示散点图
|
|
|
- color1: "", // 默认颜色
|
|
|
+ color1: colorSchemes[0].colors, // 默认颜色
|
|
|
selectedPoints: [],
|
|
|
originalColors: [],
|
|
|
originalSizes: [],
|
|
|
+ // 配色方案列表(每个方案是一个颜色数组)
|
|
|
+ colorSchemes: [...colorSchemes],
|
|
|
};
|
|
|
},
|
|
|
async mounted() {
|
|
|
this.getData();
|
|
|
+ this.color1 = colorSchemes[0].colors;
|
|
|
+ // console.log(this.color1, colorSchemes[0].colors, "color1");
|
|
|
},
|
|
|
methods: {
|
|
|
+ // 根据配色方案设置每个选项的样式
|
|
|
+ getOptionStyle(scheme) {
|
|
|
+ return {
|
|
|
+ background: `linear-gradient(to right, ${scheme.join(", ")})`,
|
|
|
+ color: "#fff",
|
|
|
+ height: "30px",
|
|
|
+ lineHeight: "30px",
|
|
|
+ borderRadius: "4px",
|
|
|
+ };
|
|
|
+ },
|
|
|
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,
|
|
|
});
|
|
|
- console.log(resultChartsData);
|
|
|
this.chartData = resultChartsData.data;
|
|
|
this.drawChart();
|
|
|
this.isError = false;
|
|
@@ -89,17 +124,50 @@ export default {
|
|
|
}
|
|
|
},
|
|
|
drawChart() {
|
|
|
+ // 提取散点数据和线数据
|
|
|
const data =
|
|
|
this.chartData.data &&
|
|
|
this.chartData.data.filter(
|
|
|
(item) => item.enginName !== "合同功率曲线"
|
|
|
)[0]; // 点数据
|
|
|
+
|
|
|
const lineData =
|
|
|
this.chartData.data &&
|
|
|
this.chartData.data.filter(
|
|
|
(item) => item.enginName === "合同功率曲线"
|
|
|
)[0]; // 线数据
|
|
|
|
|
|
+ // 提取唯一时间标签,并计算 tickvals 和 ticktext
|
|
|
+ const uniqueTimeLabels = [...new Set(data.colorbar)]; // 从 colorbar 中提取唯一的时间标签
|
|
|
+ const tickvals = uniqueTimeLabels.map((label, index) => index + 1); // 根据时间标签生成 tickvals
|
|
|
+ const ticktext = uniqueTimeLabels.map((dateStr) => {
|
|
|
+ const date = new Date(dateStr);
|
|
|
+ return date.toLocaleDateString("en-CA", {
|
|
|
+ year: "numeric",
|
|
|
+ month: "2-digit",
|
|
|
+ }); // 格式化为 'yyyy-MM'
|
|
|
+ }); // 使用格式化后的时间作为 ticktext
|
|
|
+ const timeMapping = uniqueTimeLabels.reduce((acc, curr, index) => {
|
|
|
+ acc[curr] = index + 1;
|
|
|
+ return acc;
|
|
|
+ }, {});
|
|
|
+ // 获取 yData 的最小值和最大值来做比例值的计算
|
|
|
+ const minValue = Math.min(...tickvals);
|
|
|
+ const maxValue = Math.max(...tickvals);
|
|
|
+ console.log(tickvals, ticktext, this.color1, "tickvals");
|
|
|
+ // 计算比例值
|
|
|
+ const colors = ticktext.map((item, ind) => {
|
|
|
+ // 计算比例值(可以根据需要调整映射的数据范围)
|
|
|
+ const proportion = (tickvals[ind] - minValue) / (maxValue - minValue);
|
|
|
+ return [
|
|
|
+ proportion, // 比例值
|
|
|
+ this.color1[ind], // 对应的颜色
|
|
|
+ ];
|
|
|
+ });
|
|
|
+ console.log(colors, "colors");
|
|
|
+ // 将时间字符串映射为数字
|
|
|
+ const colorValues = data.colorbar.map((date, index) => timeMapping[date]);
|
|
|
+
|
|
|
let scatterTrace = {}; // 用于存放散点图的 trace
|
|
|
let lineTrace = {}; // 用于存放折线图的 trace
|
|
|
|
|
@@ -107,8 +175,8 @@ export default {
|
|
|
this.originalColors = [...data.yData];
|
|
|
this.originalSizes = new Array(data.xData.length).fill(6); // 初始点大小
|
|
|
|
|
|
+ // 绘制散点图
|
|
|
if (this.chartType === "scatter") {
|
|
|
- // 散点图
|
|
|
scatterTrace = {
|
|
|
x: data.xData,
|
|
|
y: data.yData,
|
|
@@ -116,11 +184,12 @@ export default {
|
|
|
type: "scattergl", // 使用散点图
|
|
|
text: data.engineName, // 提示文本
|
|
|
marker: {
|
|
|
- color: data.yData, // 根据 yData 设置颜色
|
|
|
+ color: colorValues, // 使用时间数据来映射颜色
|
|
|
colorscale: this.color1
|
|
|
? [
|
|
|
- [0, "#F9FDD2"], // 颜色从 this.color1 开始
|
|
|
- [1, this.color1], // 结束颜色为其他颜色
|
|
|
+ ...colors,
|
|
|
+ // [0, this.color1[0]], // 颜色从 this.color1 开始
|
|
|
+ // [1, this.color1[this.color1.length - 1]], // 结束颜色为其他颜色
|
|
|
]
|
|
|
: [
|
|
|
[0, "#F9FDD2"],
|
|
@@ -131,27 +200,36 @@ export default {
|
|
|
[0.75, "#407DB3"],
|
|
|
[0.9, "#2E4C9A"],
|
|
|
[1, "#1B2973"],
|
|
|
- ],
|
|
|
+ ], // 默认颜色渐变
|
|
|
colorbar: {
|
|
|
title: data.colorbartitle, // 色标标题
|
|
|
+ tickvals: tickvals, // 设置刻度值
|
|
|
+ ticktext: ticktext, // 设置刻度文本
|
|
|
+ tickmode: "array", // 使用数组模式
|
|
|
+ tickangle: -45, // 可选:调整刻度文本的角度
|
|
|
},
|
|
|
- size: new Array(data.xData.length).fill(6), // 初始点大小
|
|
|
+ size: new Array(data.xData.length).fill(this.pointSize), // 点的大小
|
|
|
+ },
|
|
|
+ hovertemplate:
|
|
|
+ "风速: %{x}(m/s)<br>" +
|
|
|
+ "有功功率: %{y}(kw)<br>" +
|
|
|
+ `时间: %{customdata}<extra></extra>`, // 在 hover 中显示格式化后的时间
|
|
|
+ customdata: data.colorbar, // 将格式化后的时间存入 customdata
|
|
|
+ };
|
|
|
+ }
|
|
|
+ if (lineData) {
|
|
|
+ // 绘制折线图
|
|
|
+ lineTrace = {
|
|
|
+ x: lineData.xData, // 线数据的 xData
|
|
|
+ y: lineData.yData, // 线数据的 yData
|
|
|
+ mode: "lines+markers", // 线和点同时显示
|
|
|
+ type: "scattergl", // 使用 scattergl 类型
|
|
|
+ text: lineData.engineName, // 提示文本
|
|
|
+ line: {
|
|
|
+ color: "red", // 线条颜色
|
|
|
},
|
|
|
};
|
|
|
}
|
|
|
-
|
|
|
- // 折线图
|
|
|
- lineTrace = {
|
|
|
- x: lineData.xData, // 线数据的 xData
|
|
|
- y: lineData.yData, // 线数据的 yData
|
|
|
- mode: "lines+markers", // 线和点同时显示
|
|
|
- type: "scattergl", // 使用 scattergl 类型
|
|
|
- text: lineData.engineName, // 提示文本
|
|
|
- line: {
|
|
|
- // color: this.color1 || "red", // 使用自定义颜色
|
|
|
- color: "red",
|
|
|
- },
|
|
|
- };
|
|
|
|
|
|
// 图表布局
|
|
|
const layout = {
|
|
@@ -175,6 +253,7 @@ export default {
|
|
|
gridcolor: "#fff", // 设置网格线颜色
|
|
|
};
|
|
|
|
|
|
+ // 配置工具栏按钮
|
|
|
const config = {
|
|
|
modeBarButtonsToAdd: [
|
|
|
{
|
|
@@ -194,27 +273,26 @@ export default {
|
|
|
},
|
|
|
],
|
|
|
modeBarButtonsToRemove: [
|
|
|
- // 移除不需要的工具按钮
|
|
|
- "lasso2d",
|
|
|
+ "lasso2d", // 移除不需要的工具按钮
|
|
|
],
|
|
|
displaylogo: false,
|
|
|
editable: true,
|
|
|
scrollZoom: false,
|
|
|
};
|
|
|
|
|
|
- // 合并 scatter 和 line 数据
|
|
|
+ // 合并散点和折线图的数据
|
|
|
const traces = [];
|
|
|
if (scatterTrace) traces.push(scatterTrace); // 如果有散点数据
|
|
|
if (lineTrace) traces.push(lineTrace); // 如果有线图数据
|
|
|
|
|
|
// 使用 Plotly 绘制图表
|
|
|
Plotly.react(
|
|
|
- this.$refs[`plotlyChart-${this.index}`],
|
|
|
+ this.$refs[`plotlyChart-${this.index}`], // 这里是对 DOM 元素的引用
|
|
|
traces,
|
|
|
layout,
|
|
|
config
|
|
|
).then(() => {
|
|
|
- // 确保在图表加载完成后设置工具栏按钮
|
|
|
+ // 确保图表加载完成后设置工具栏按钮
|
|
|
const plotElement = this.$refs[`plotlyChart-${this.index}`];
|
|
|
Plotly.relayout(plotElement, layout); // 使用 relayout 来确保自定义按钮应用
|
|
|
});
|
|
@@ -343,8 +421,8 @@ export default {
|
|
|
},
|
|
|
updateChartColor(color) {
|
|
|
// 更新图表颜色
|
|
|
- this.color1 = color;
|
|
|
- console.log(this.color1, "this.color1");
|
|
|
+ console.log(color, "this.color1");
|
|
|
+ // this.color1 = color;
|
|
|
this.drawChart();
|
|
|
},
|
|
|
},
|